{"id":29795,"date":"2024-11-25T13:51:36","date_gmt":"2024-11-25T05:51:36","guid":{"rendered":"https:\/\/fwq.ai\/blog\/29795\/"},"modified":"2024-11-25T13:51:36","modified_gmt":"2024-11-25T05:51:36","slug":"net-c%e4%bd%bf%e7%94%a8%e5%be%ae%e4%bf%a1%e5%85%ac%e4%bc%97%e5%8f%b7%e7%99%bb%e5%bd%95%e7%bd%91%e7%ab%99%e7%9a%84%e5%ae%9e%e4%be%8b%e8%a7%a3%e6%9e%90","status":"publish","type":"post","link":"https:\/\/fwq.ai\/blog\/29795\/","title":{"rendered":".NET C#\u4f7f\u7528\u5fae\u4fe1\u516c\u4f17\u53f7\u767b\u5f55\u7f51\u7ad9\u7684\u5b9e\u4f8b\u89e3\u6790"},"content":{"rendered":"<p>\u8fd9\u7bc7\u6587\u7ae0\u4e3b\u8981\u4ecb\u7ecd\u4e86.net \u4f7f\u7528\u5fae\u4fe1\u516c\u4f17\u53f7\u767b\u5f55\u7f51\u7ad9\uff0c\u6559\u5927\u5bb6\u5229\u7528\u5fae\u4fe1\u516c\u4f17\u53f7\u8fdb\u884c\u7f51\u7ad9\u767b\u5f55\uff0c\u611f\u5174\u8da3\u7684\u5c0f\u4f19\u4f34\u4eec\u53ef\u4ee5\u53c2\u8003\u4e00\u4e0b<\/p>\n<p>\u9002\u7528\u4e8e\uff1a\u672c\u6587\u9002\u7528\u4e8e\u6709\u4e00\u5b9a\u5fae\u4fe1\u5f00\u53d1\u57fa\u7840\u7684\u7528\u6237\u3000\u3000<\/p>\n<p><strong>\u5f15\u8a00\uff1a<br \/><\/strong>\u82b1\u4e86300\u5927\u6d0b\u7533\u8bf7\u4e86\u5fae\u4fe1\u516c\u4f17\u5e73\u53f0\u540e\uff0c\u53d1\u73b0\u4e0d\u80fd\u4f7f\u7528\u5fae\u4fe1\u516c\u4f17\u53f7\u767b\u5f55\u7f51\u7ad9(\u975e\u5fae\u4fe1\u6253\u5f00)\u83b7\u5f97\u5fae\u4fe1\u5e10\u53f7\u3002\u4ed4\u7ec6\u7814\u7a76\u540e\u624d\u53d1\u73b0\u8fd8\u8981\u518d\u82b1300\u5927\u6d0b\u7533\u8bf7\u5fae\u4fe1\u5f00\u653e\u5e73\u53f0\u624d\u80fd\u63a5\u5165\u7f51\u7ad9\u7684\u767b\u5f55\u3002\u4e8e\u662f\u505a\u4e3a\u5c4c\u4e1d\u7a0b\u5e8f\u5458\u7684\u6211\u60f3\u5230\u4e86\u81ea\u5df1\u505a\u4e00\u4e2a\u767b\u5f55\u63a5\u53e3\u3002<\/p>\n<p><strong>\u5de5\u5177\u548c\u73af\u5883\uff1a<br \/><\/strong>1. VS2013 .net4.0 C# MVC4.0 Razor<br \/>2.\u63d2\u4ef6<br \/>A. Microsoft.AspNet.SignalR;\u65f6\u65f6\u83b7\u53d6\u540e\u53f0\u6570\u636e<br \/>B.Gma.QrCodeNet.Encoding;\u6587\u672c\u751f\u6210\u4e8c\u7ef4\u7801&nbsp;<\/p>\n<p><strong>\u5b9e\u73b0\u7684\u76ee\u6807<br \/><\/strong>1. \u5728\u7535\u8111\u4e0a\u6253\u5f00\u7f51\u7ad9\u767b\u5f55\u9875\uff0c\u63d0\u793a\u7528\u6237\u4f7f\u7528\u5fae\u4fe1\u626b\u63cf\u767b\u5f55\u786e\u8ba4\u3002<br \/>2.\u7528\u6237\u901a\u8fc7\u5fae\u4fe1\u626b\u63cf\u786e\u8ba4\u540e\uff0c\u7535\u8111\u81ea\u52a8\u6536\u5230\u786e\u8ba4\u4fe1\u606f\u8df3\u8f6c\u5230\u7f51\u7ad9\u4e3b\u9875\u3002&nbsp;<\/p>\n<p><strong>\u539f\u7406\u5206\u6790<br \/><\/strong>&nbsp;1.SignalR\u662f\u4e00\u4e2a\u795e\u5947\u7684\u5de5\u5177\uff0c\u80fd\u4ece\u6d4f\u89c8\u5668A\u53d1\u9001\u4fe1\u606f\u5230\u670d\u52a1\u5668\uff0c\u670d\u52a1\u5668\u81ea\u52a8\u63a8\u9001\u6d88\u606f\u5230\u6307\u5b9a\u7684\u6d4f\u89c8\u5668B\u3002\u90a3\u4e48\u6211\u7684\u8ba1\u5212\u662f\u7528\u7535\u8111\u7684\u6d4f\u89c8\u5668\u6253\u5f00\u767b\u5f55\u9875\uff0c\u751f\u6210\u4e00\u4e2a\u4e8c\u7ef4\u7801(\u5185\u5bb9\u4e3a\u5e26\u6709\u5fae\u4fe1\u516c\u4f17\u5e73\u53f0\u7f51\u9875\u7528\u6237\u53d7\u6743\u7684\u7f51\u5740)\uff0c\u7528\u5fae\u4fe1\u7684\u63cf\u7801\u529f\u80fd\u6253\u5f00\u8fd9\u4e2a\u7f51\u7ad9\u3002\u5c06\u83b7\u53d6\u7684\u5fae\u4fe1\u7528\u6237OPENID\u901a\u8fc7SignalR\u53d1\u9001\u5230\u7535\u8111\u6d4f\u89c8\u5668\uff0c\u5b9e\u73b0\u767b\u5f55\u529f\u80fd<\/p>\n<p><strong>&nbsp;\u5b9e\u73b0\u8fc7\u7a0b<br \/><\/strong>1.\u5fae\u4fe1\u516c\u4ece\u5e73\u53f0\u7684\u6ce8\u518c\u548c\u6743\u9650(\u7565\u8fc7&#8230;)<br \/>2.VS2013\u4e2d\u65b0\u5efaMVC\u7f51\u7ad9,\u6211\u7528\u7684\u73af\u5883\u4e3a.NET4.0 C# MVC4.0&nbsp; Razor\u5f15\u64ce(\u4e2a\u4eba\u4e60\u60ef)\u3002<\/p>\n<p style=\"text-align: center\"><img decoding=\"async\" src=\"https:\/\/img.php.cn\/upload\/article\/000\/001\/505\/2b35252c48041f83d69949c298298cb9-0.png\" class=\"aligncenter\" title=\".NET C#\u4f7f\u7528\u5fae\u4fe1\u516c\u4f17\u53f7\u767b\u5f55\u7f51\u7ad9\u7684\u5b9e\u4f8b\u89e3\u6790\u63d2\u56fe\" alt=\".NET C#\u4f7f\u7528\u5fae\u4fe1\u516c\u4f17\u53f7\u767b\u5f55\u7f51\u7ad9\u7684\u5b9e\u4f8b\u89e3\u6790\u63d2\u56fe\" \/><\/p>\n<p>3.\u5b89\u88c5 SignalR<br \/>&nbsp;VS2013 \u70b9\u51fb\u5de5\u5177 ==&gt; \u5e93\u7a0b\u5e8f\u5305\u7ba1\u7406\u5668 ==&gt; \u7a0b\u5e8f\u5305\u7ba1\u7406\u63a7\u5236\u53f0<\/p>\n<p>&nbsp;\u8f93\u5165\u4ee5\u4e0b\u547d\u4ee4:<br \/>&nbsp;<span style=\"color: #800000\">Install-Package Microsoft.AspNet.SignalR -Version 1.1.4<\/span>&nbsp;<\/p>\n<p>.net4.0 Mvc4\u73af\u5883\u4e0b\u5efa\u8bae\u5b89\u88c51.1.4\u9ad8\u7248\u672c\u5b89\u88c5\u4e0d\u4e0a<\/p>\n<p>&nbsp;\u5b89\u88c5 SingnalR\u6210\u529f&nbsp;<\/p>\n<p style=\"text-align: center\"><img decoding=\"async\" src=\"https:\/\/img.php.cn\/upload\/article\/000\/001\/505\/d2a22acdb17f1c6fd5974a5b4e9cb8b4-1.png\" class=\"aligncenter\" title=\".NET C#\u4f7f\u7528\u5fae\u4fe1\u516c\u4f17\u53f7\u767b\u5f55\u7f51\u7ad9\u7684\u5b9e\u4f8b\u89e3\u6790\u63d2\u56fe1\" alt=\".NET C#\u4f7f\u7528\u5fae\u4fe1\u516c\u4f17\u53f7\u767b\u5f55\u7f51\u7ad9\u7684\u5b9e\u4f8b\u89e3\u6790\u63d2\u56fe1\" \/><\/p>\n<p>\u8bbe\u7f6eSignalR<\/p>\n<p style=\"text-align: center\"><img decoding=\"async\" src=\"https:\/\/img.php.cn\/upload\/article\/000\/001\/505\/eeec65de5aa7a7ea44f6c8a8914737ec-2.png\" class=\"aligncenter\" title=\".NET C#\u4f7f\u7528\u5fae\u4fe1\u516c\u4f17\u53f7\u767b\u5f55\u7f51\u7ad9\u7684\u5b9e\u4f8b\u89e3\u6790\u63d2\u56fe2\" alt=\".NET C#\u4f7f\u7528\u5fae\u4fe1\u516c\u4f17\u53f7\u767b\u5f55\u7f51\u7ad9\u7684\u5b9e\u4f8b\u89e3\u6790\u63d2\u56fe2\" \/><\/p>\n<p><span style=\"color: #800000\">var config = new Microsoft.AspNet.SignalR.HubConfiguration();<br \/>&nbsp;config.EnableCrossDomain = true;<br \/>&nbsp;RouteTable.Routes.MapHubs(config);<\/span>&nbsp;<\/p>\n<p>\u65b0\u5efa\u4e00\u4e2a\u7c7b PushHub.cs&nbsp;<\/p>\n<p><\/p>\n<pre>using&nbsp;Microsoft.AspNet.SignalR;\r\nusing&nbsp;Microsoft.AspNet.SignalR.Hubs;\r\nusing&nbsp;System;\r\nusing&nbsp;System.Collections.Generic;\r\nusing&nbsp;System.Linq;\r\nusing&nbsp;System.Web;\r\nnamespace&nbsp;WD.C.Utility\r\n{\r\n&nbsp;\/\/\/&nbsp;&lt;summary&gt;\r\n&nbsp;\/\/\/&nbsp;\u6807\u6ce8Single&nbsp;javascription\u8981\u8fde\u63a5\u7684\u540d\u79f0\r\n&nbsp;\/\/\/&nbsp;&lt;\/summary&gt;\r\n&nbsp;[HubName(\"pushHub\")]\r\n&nbsp;public&nbsp;class&nbsp;PushHub&nbsp;:&nbsp;Hub\r\n&nbsp;{\r\n&nbsp;\/\/\/&nbsp;&lt;summary&gt;\r\n&nbsp;\/\/\/&nbsp;\u4e34\u65f6\u4fdd\u5b58\u8bf7\u6c42\u7684\u7528\u6237\r\n&nbsp;\/\/\/&nbsp;&lt;\/summary&gt;\r\n&nbsp;static&nbsp;Dictionary&lt;string&gt;&nbsp;rlist&nbsp;=&nbsp;new&nbsp;Dictionary&lt;string&gt;();\r\n&nbsp;\r\n&nbsp;\/\/\/&nbsp;&lt;summary&gt;\r\n&nbsp;\/\/\/&nbsp;\u767b\u5f55\u8bf7\u6c42\u7684\u7528\u6237;\u6253\u5f00Login\u9875\u6267\u884c\u672c\u65b9\u6cd5,\u7528\u4e8e\u8bb0\u5f55\u6d4f\u89c8\u5668\u8fde\u63a5\u7684ID\r\n&nbsp;\/\/\/&nbsp;&lt;\/summary&gt;\r\n&nbsp;public&nbsp;void&nbsp;ruserConnected()\r\n&nbsp;{\r\n&nbsp;if&nbsp;(!rlist.ContainsKey(Context.ConnectionId))\r\n&nbsp;rlist.Add(Context.ConnectionId,&nbsp;string.Empty);\r\n\r\n&nbsp;\/\/Client\u65b9\u5f0f\u8868\u793a\u5bf9\u6307\u5b9aID\u7684\u6d4f\u89c8\u5668\u53d1\u9001GetUserId\u65b9\u6cd5,\u6d4f\u89c8\u5668\u901a\u8fc7javascrip\u65b9\u6cd5GetUserId(string)\u5f97\u5230\u540e\u53f0\u53d1\u6765\u7684Context.ConnectionId\r\n&nbsp;Clients.Client(Context.ConnectionId).GetUserId(Context.ConnectionId);\r\n&nbsp;}\r\n&nbsp;\/\/\/&nbsp;&lt;summary&gt;\r\n&nbsp;\/\/\/&nbsp;\u5b9e\u9645\u767b\u5f55\u7684\u7528\u6237\r\n&nbsp;\/\/\/&nbsp;&lt;\/summary&gt;\r\n&nbsp;\/\/\/&nbsp;&lt;param&gt;\u8bf7\u6c42\u7684\u7528\u6237ID\r\n&nbsp;\/\/\/&nbsp;&lt;param&gt;\u5fae\u4fe1OPENID\r\n&nbsp;public&nbsp;void&nbsp;logUserConnected(string&nbsp;ruser,&nbsp;string&nbsp;logUserID)\r\n&nbsp;{\r\n&nbsp;if&nbsp;(rlist.ContainsKey(ruser))\r\n&nbsp;{\r\n&nbsp;rlist.Remove(ruser);\r\n\r\n&nbsp;\/\/Client\u65b9\u5f0f\u8868\u793a\u5bf9\u6307\u5b9aID\u7684\u6d4f\u89c8\u5668\u53d1\u9001GetUserId\u65b9\u6cd5,\u6d4f\u89c8\u5668\u901a\u8fc7javascrip\u65b9\u6cd5userLoginSuccessful(bool,string)\u5f97\u5230\u540e\u53f0\u53d1\u6765\u7684\u767b\u5f55\u6210\u529f\uff0c\u548c\u5fae\u4fe1OPENID\r\n&nbsp;Clients.Client(ruser).userLoginSuccessful(true,&nbsp;logUserID);\r\n&nbsp;}\r\n&nbsp;}\r\n&nbsp;}\r\n}&lt;\/string&gt;&lt;\/string&gt;<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u65b0\u5efa\u4e00\u4e2aMVC\u63a7\u5236\u5668&#8221;LoginController.cs&#8221;,\u8fd9\u4e2a\u4e0d\u4f1a\u770b\u522b\u7684\u6559\u7a0b;&nbsp;<\/p>\n<pre>using&nbsp;System;\r\nusing&nbsp;System.Collections.Generic;\r\nusing&nbsp;System.Linq;\r\nusing&nbsp;System.Web;\r\nusing&nbsp;System.Web.Mvc;\r\nnamespace&nbsp;WD.C.Controllers\r\n{\r\n&nbsp;public&nbsp;class&nbsp;LoginController&nbsp;:&nbsp;Controller\r\n&nbsp;{\r\n&nbsp;\/\/\r\n&nbsp;\/\/&nbsp;GET:&nbsp;\/Login\/\r\n\r\n&nbsp;\/\/\/&nbsp;&lt;summary&gt;\r\n&nbsp;\/\/\/&nbsp;\u767b\u5f55\u4e3b\u9875,\u7535\u8111\u7aef\u6253\u5f00\r\n&nbsp;\/\/\/&nbsp;&lt;\/summary&gt;\r\n&nbsp;\/\/\/&nbsp;&lt;returns&gt;&lt;\/returns&gt;\r\n&nbsp;public&nbsp;ActionResult&nbsp;Index()\r\n&nbsp;{\r\n&nbsp;\/*\u53c2\u8003&nbsp;https:\/\/mp.weixin.qq.com\/wiki?t=resource\/res_main&amp;amp;id=mp1421140842&amp;amp;token=&amp;amp;lang=zh_CN\r\n&nbsp;*1.URL\u7528\u4e8e\u751f\u6210\u4e8c\u7ef4\u7801\u7ed9\u5fae\u4fe1\u626b\u63cf\r\n&nbsp;*2.\u683c\u5f0f\u53c2\u8003\u5fae\u4fe1\u516c\u4ece\u5e73\u53f0\u5e2e\u52a9\r\n&nbsp;*&nbsp;https:\/\/open.weixin.qq.com\/connect\/oauth2\/authorize?appid=APPID&amp;amp;redirect_uri=REDIRECT_URI&amp;amp;response_type=code&amp;amp;scope=SCOPE&amp;amp;state=STATE#wechat_redirect&nbsp;\u82e5\u63d0\u793a\u201c\u8be5\u94fe\u63a5\u65e0\u6cd5\u8bbf\u95ee\u201d\uff0c\u8bf7\u68c0\u67e5\u53c2\u6570\u662f\u5426\u586b\u5199\u9519\u8bef\uff0c\u662f\u5426\u62e5\u6709scope\u53c2\u6570\u5bf9\u5e94\u7684\u6388\u6743\u4f5c\u7528\u57df\u6743\u9650\u3002&nbsp;\r\n&nbsp;*3.REDIRECT_URI\u5185\u5bb9\u4e3a\u8fd4\u56de\u5730\u5740\uff0c\u9700\u8981\u5f00\u53d1\u8005\u9700\u8981\u5148\u5230\u516c\u4f17\u5e73\u53f0\u5b98\u7f51\u4e2d\u7684\u201c\u5f00\u53d1&nbsp;-&nbsp;\u63a5\u53e3\u6743\u9650&nbsp;-&nbsp;\u7f51\u9875\u670d\u52a1&nbsp;-&nbsp;\u7f51\u9875\u5e10\u53f7&nbsp;-&nbsp;\u7f51\u9875\u6388\u6743\u83b7\u53d6\u7528\u6237\u57fa\u672c\u4fe1\u606f\u201d\u7684\u914d\u7f6e\u9009\u9879\u4e2d\uff0c\u4fee\u6539\u6388\u6743\u56de\u8c03\u57df\u540d\r\n&nbsp;*4.REDIRECT_URI\u5e94\u56de\u8c03\u5230WxLog\u9875\u5e76\u8fdb\u884cURLEncode\u7f16\u7801,\u5982:&nbsp;redirect_uri=GetURLEncode(\"http:\/\/\u4f60\u7684\u7f51\u7ad9\/Login\/WxLog?ruser=\");&nbsp;ruser\u4e3aPushHub\u4e2d\u7684Context.ConnectionId\u5230View\u4e2d\u914d\u7f6e&nbsp;\r\n&nbsp;*\r\n&nbsp;*\/\r\n&nbsp;ViewBag.Url&nbsp;=&nbsp;string.Format(\"https:\/\/open.weixin.qq.com\/connect\/oauth2\/authorize?appid={0}&amp;amp;redirect_uri={1}&amp;amp;response_type=code&amp;amp;scope=snsapi_base&amp;amp;state={2}#wechat_redirect\",&nbsp;B.Helper.AppID,&nbsp;GetURLEncode(\"http:\/\/\u4f60\u7684\u7f51\u7ad9\/Login\/WxLog?ruser=\"),&nbsp;Guid.NewGuid());\r\n&nbsp;return&nbsp;View();\r\n&nbsp;}\r\n\r\n&nbsp;\/\/\/&nbsp;&lt;summary&gt;\r\n&nbsp;\/\/\/&nbsp;\u767b\u5f55\u786e\u8ba4\u9875,\u5fae\u4fe1\u7aef\u6253\u5f00\r\n&nbsp;\/\/\/&nbsp;&lt;\/summary&gt;\r\n&nbsp;\/\/\/&nbsp;&lt;param&gt;\r\n&nbsp;\/\/\/&nbsp;&lt;returns&gt;&lt;\/returns&gt;\r\n&nbsp;public&nbsp;ActionResult&nbsp;WxLog(string&nbsp;ruser)\r\n&nbsp;{&nbsp;\r\n\/\/\u4f7f\u7528\u5fae\u4fe1\u767b\u5f55\r\nif&nbsp;(!string.IsNullOrEmpty(code))\r\n&nbsp;{\r\n&nbsp;string&nbsp;loguser=&nbsp;B.Helper.GetOpenIDByCode(code);\r\n&nbsp;Session[\"LogUserID\"]&nbsp;=loguser;\r\n&nbsp;ViewBag.LogUserID&nbsp;=&nbsp;loguser;\r\n&nbsp;}\r\n\r\n&nbsp;ViewBag.ruser&nbsp;=&nbsp;ruser;\r\n&nbsp;return&nbsp;View();\r\n&nbsp;\r\n&nbsp;}\r\n&nbsp;}\r\n}<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u63a7\u5236\u5668 &#8220;QRController.cs&#8221;\u7528\u4e8e\u6587\u672c\u751f\u6210\u4e8c\u7ef4\u7801&nbsp;<\/p>\n<pre>using&nbsp;System;\r\nusing&nbsp;System.Collections.Generic;\r\nusing&nbsp;System.Linq;\r\nusing&nbsp;System.Web;\r\nusing&nbsp;System.Web.Mvc;\r\n\r\nnamespace&nbsp;WD.C.Controllers\r\n{\r\n&nbsp;public&nbsp;class&nbsp;QRController&nbsp;:&nbsp;Controller\r\n&nbsp;{\r\n&nbsp;\/\/\r\n&nbsp;\/\/&nbsp;GET:&nbsp;\/QR\/\r\n\r\n&nbsp;public&nbsp;ActionResult&nbsp;Index()\r\n&nbsp;{\r\n&nbsp;return&nbsp;View();\r\n&nbsp;}\r\n&nbsp;\/\/\/&nbsp;&lt;summary&gt;\r\n&nbsp;\/\/\/&nbsp;\u83b7\u5f972\u7ef4\u7801\u56fe\u7247\r\n&nbsp;\/\/\/&nbsp;&lt;\/summary&gt;\r\n&nbsp;\/\/\/&nbsp;&lt;param&gt;\r\n&nbsp;\/\/\/&nbsp;&lt;returns&gt;&lt;\/returns&gt;\r\n&nbsp;public&nbsp;ActionResult&nbsp;GetQRCodeImg(string&nbsp;str)\r\n&nbsp;{\r\n&nbsp;using&nbsp;(var&nbsp;ms&nbsp;=&nbsp;new&nbsp;System.IO.MemoryStream())\r\n&nbsp;{\r\n\r\n&nbsp;string&nbsp;stringtest&nbsp;=&nbsp;str;\r\n&nbsp;GetQRCode(stringtest,&nbsp;ms);\r\n&nbsp;Response.ContentType&nbsp;=&nbsp;\"image\/Png\";\r\n&nbsp;Response.OutputStream.Write(ms.GetBuffer(),&nbsp;0,&nbsp;(int)ms.Length);\r\n&nbsp;System.Drawing.Bitmap&nbsp;img&nbsp;=&nbsp;new&nbsp;System.Drawing.Bitmap(100,&nbsp;100);\r\n&nbsp;img.Save(ms,&nbsp;System.Drawing.Imaging.ImageFormat.Jpeg);\r\n&nbsp;Response.End();\r\n&nbsp;return&nbsp;File(ms.ToArray(),&nbsp;@\"image\/jpeg\");\r\n&nbsp;}\r\n&nbsp;}\r\n&nbsp;private&nbsp;static&nbsp;bool&nbsp;GetQRCode(string&nbsp;strContent,&nbsp;System.IO.MemoryStream&nbsp;ms)\r\n&nbsp;{\r\n\r\n&nbsp;Gma.QrCodeNet.Encoding.ErrorCorrectionLevel&nbsp;Ecl&nbsp;=&nbsp;Gma.QrCodeNet.Encoding.ErrorCorrectionLevel.M;&nbsp;\/\/\u8bef\u5dee\u6821\u6b63\u6c34\u5e73&nbsp;\r\n&nbsp;string&nbsp;Content&nbsp;=&nbsp;strContent;\/\/\u5f85\u7f16\u7801\u5185\u5bb9\r\n&nbsp;Gma.QrCodeNet.Encoding.Windows.Render.QuietZoneModules&nbsp;QuietZones&nbsp;=&nbsp;Gma.QrCodeNet.Encoding.Windows.Render.QuietZoneModules.Two;&nbsp;\/\/\u7a7a\u767d\u533a\u57df&nbsp;\r\n&nbsp;int&nbsp;ModuleSize&nbsp;=&nbsp;12;\/\/\u5927\u5c0f\r\n&nbsp;var&nbsp;encoder&nbsp;=&nbsp;new&nbsp;Gma.QrCodeNet.Encoding.QrEncoder(Ecl);\r\n&nbsp;Gma.QrCodeNet.Encoding.QrCode&nbsp;qr;\r\n&nbsp;if&nbsp;(encoder.TryEncode(Content,&nbsp;out&nbsp;qr))\/\/\u5bf9\u5185\u5bb9\u8fdb\u884c\u7f16\u7801\uff0c\u5e76\u4fdd\u5b58\u751f\u6210\u7684\u77e9\u9635\r\n&nbsp;{\r\n&nbsp;var&nbsp;render&nbsp;=&nbsp;new&nbsp;Gma.QrCodeNet.Encoding.Windows.Render.GraphicsRenderer(new&nbsp;Gma.QrCodeNet.Encoding.Windows.Render.FixedModuleSize(ModuleSize,&nbsp;QuietZones));\r\n&nbsp;render.WriteToStream(qr.Matrix,&nbsp;System.Drawing.Imaging.ImageFormat.Png,&nbsp;ms);\r\n&nbsp;}\r\n&nbsp;else\r\n&nbsp;{\r\n&nbsp;return&nbsp;false;\r\n&nbsp;}\r\n&nbsp;return&nbsp;true;\r\n&nbsp;}\r\n&nbsp;}\r\n}<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u89c6\u56fe \u5f00\u542fSignalR<br \/><span style=\"color: #800000\">&nbsp; var chat = $.connection.pushHub;<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $.connection.hub.start().done(function () {<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chat.server.ruserConnected(); <br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }); <\/span><\/p>\n<p><span style=\"color: #800000\">$.connection.pushHub\u5bf9\u5e94<\/span><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/img.php.cn\/upload\/article\/000\/001\/505\/eeec65de5aa7a7ea44f6c8a8914737ec-3.png\" class=\"aligncenter\" title=\".NET C#\u4f7f\u7528\u5fae\u4fe1\u516c\u4f17\u53f7\u767b\u5f55\u7f51\u7ad9\u7684\u5b9e\u4f8b\u89e3\u6790\u63d2\u56fe3\" alt=\".NET C#\u4f7f\u7528\u5fae\u4fe1\u516c\u4f17\u53f7\u767b\u5f55\u7f51\u7ad9\u7684\u5b9e\u4f8b\u89e3\u6790\u63d2\u56fe3\" \/><\/p>\n<p><span style=\"color: #800000\">chat.server.ruserConnected();\u5bf9\u5e94<\/span><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/img.php.cn\/upload\/article\/000\/001\/505\/eeec65de5aa7a7ea44f6c8a8914737ec-4.png\" class=\"aligncenter\" title=\".NET C#\u4f7f\u7528\u5fae\u4fe1\u516c\u4f17\u53f7\u767b\u5f55\u7f51\u7ad9\u7684\u5b9e\u4f8b\u89e3\u6790\u63d2\u56fe4\" alt=\".NET C#\u4f7f\u7528\u5fae\u4fe1\u516c\u4f17\u53f7\u767b\u5f55\u7f51\u7ad9\u7684\u5b9e\u4f8b\u89e3\u6790\u63d2\u56fe4\" \/><\/p>\n<p>\u8868\u793a\u8c03\u7528&#8221;pushHub&#8221;\u8fd0\u884c\u540e\u6267\u884c runserConnected\u65b9\u6cd5\uff0c\u5728\u4e34\u65f6\u8868\u4e2d\u589e\u52a0\u5f53\u524d\u6d4f\u89c8\u5668\u7684ConnectionID<\/p>\n<p><\/p>\n<pre>chat.client.getUserId&nbsp;=&nbsp;function&nbsp;(ruserid)\r\n{\r\n\u3000\u3000\/\/\u4e8c\u7ef4\u7801\u751f\u6210\u7684\u6587\u672c\r\n$(\"#loga\").attr(\"src\",&nbsp;\"@ViewBag.Url\"&nbsp;+&nbsp;ruserid);\r\n}<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/img.php.cn\/upload\/article\/000\/001\/505\/d39e9e178f1d06a062f2402e9df64456-5.png\" class=\"aligncenter\" title=\".NET C#\u4f7f\u7528\u5fae\u4fe1\u516c\u4f17\u53f7\u767b\u5f55\u7f51\u7ad9\u7684\u5b9e\u4f8b\u89e3\u6790\u63d2\u56fe5\" alt=\".NET C#\u4f7f\u7528\u5fae\u4fe1\u516c\u4f17\u53f7\u767b\u5f55\u7f51\u7ad9\u7684\u5b9e\u4f8b\u89e3\u6790\u63d2\u56fe5\" \/><\/p>\n<p>\u8868\u793a\u53f0\u540e\u6570\u636e&nbsp;<br \/>\u6536\u5230\u6570\u636e\u540e\u8fd4\u56de\u5230\u6e38\u89c8\u5668<\/p>\n<pre>chat.client.userLoginSuccessful&nbsp;=&nbsp;function&nbsp;(r,&nbsp;userid)&nbsp;{\r\n&nbsp;if&nbsp;(r)&nbsp;{\r\n&nbsp;$.post(\"\/Login\/AddSession\/\",&nbsp;{&nbsp;userid:&nbsp;userid&nbsp;},&nbsp;function&nbsp;(r2)&nbsp;{\r\n&nbsp;if&nbsp;(r2)&nbsp;{\r\n&nbsp;location.href&nbsp;=&nbsp;\"\/Home\/\";\r\n&nbsp;}\r\n&nbsp;})\r\n&nbsp;}\r\n&nbsp;};<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u7528\u6237\u901a\u8fc7\u5fae\u4fe1\u767b\u5f55\u540e&nbsp;<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/img.php.cn\/upload\/article\/000\/001\/505\/d39e9e178f1d06a062f2402e9df64456-6.png\" class=\"aligncenter\" title=\".NET C#\u4f7f\u7528\u5fae\u4fe1\u516c\u4f17\u53f7\u767b\u5f55\u7f51\u7ad9\u7684\u5b9e\u4f8b\u89e3\u6790\u63d2\u56fe6\" alt=\".NET C#\u4f7f\u7528\u5fae\u4fe1\u516c\u4f17\u53f7\u767b\u5f55\u7f51\u7ad9\u7684\u5b9e\u4f8b\u89e3\u6790\u63d2\u56fe6\" \/><\/p>\n<p>\u63a5\u6536\u5fae\u4fe1OpenID&nbsp;&nbsp;<br \/><span style=\"color: #800000\">&nbsp;$.post(&#8220;\/Login\/AddSession\/&#8221;, { userid: userid }, function (r2) {<br \/>if (r2) {<br \/>location.href = &#8220;\/Home\/&#8221;;<br \/>}<br \/>})<\/span>&nbsp;<\/p>\n<p>\u6267\u884c Post\u5230\u540e\u53f0\u589e\u52a0\u767b\u5f55\u4fe1\u606f\uff0c\u6210\u529f\u540e\u8f6c\u5230\/Home\/\u4e3b\u9875&nbsp;<\/p>\n<pre>\/\/\/&nbsp;&lt;summary&gt;\r\n&nbsp;\/\/\/&nbsp;\u4fdd\u5b58\u5fae\u4fe1\u786e\u8ba4\u767b\u5f55\u540e\u8fd4\u56de\u7684OPENID\uff0c\u505a\u4e3a\u7f51\u7ad9\u7684Session[\"LogUserID\"]\r\n&nbsp;\/\/\/&nbsp;&lt;\/summary&gt;\r\n&nbsp;\/\/\/&nbsp;&lt;param&gt;\r\n&nbsp;\/\/\/&nbsp;&lt;returns&gt;&lt;\/returns&gt;\r\n&nbsp;public&nbsp;JsonResult&nbsp;AddSession(string&nbsp;userid)\r\n&nbsp;{\r\n&nbsp;Session[\"LogUserID\"]&nbsp;=&nbsp;userid;\r\n&nbsp;return&nbsp;Json(true);\r\n&nbsp;}<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>Login\/WxLog.cshtml \u672c\u9875\u5728\u5fae\u4fe1\u4e0a\u6253\u5f00&nbsp;<\/p>\n<pre>@{\r\n&nbsp;ViewBag.Title&nbsp;=&nbsp;\"WxLog\";\r\n}\r\n&lt;script&gt;&lt;\/script&gt;&lt;script&gt;&lt;\/script&gt;&lt;script&gt;\r\n $(function () {\r\n \/\/\u8fde\u63a5SignalR pushHab\r\n var chat = $.connection.pushHub;\r\n \/\/\u542f\u52a8\r\n $.connection.hub.start().done();\r\n\r\n $(\"#btnLog\").click(function () {\r\n \/\/\u767b\u5f55,\u53d1\u9001\u4fe1\u606f\u5230\u670d\u52a1\u5668\r\n chat.server.logUserConnected(\"@ViewBag.ruser\",\"@ViewBag.LogUserID\");\r\n });\r\n });\r\n&lt;\/script&gt;&lt;h2&gt;WxLog&lt;\/h2&gt;\r\n\r\n&lt;a&gt;\u767b\u5f55&lt;\/a&gt;\r\n\r\n@{\r\n&nbsp;ViewBag.Title&nbsp;=&nbsp;\"Index\";\r\n}\r\n&nbsp;@Scripts.Render(\"~\/bundles\/jquery\")\r\n&lt;script&gt;&lt;\/script&gt;&lt;script&gt;&lt;\/script&gt;&lt;script&gt;\r\n $(function () {\r\n var chat = $.connection.pushHub;\r\n $.connection.hub.start().done(function () {\r\n chat.server.ruserConnected();\r\n });\r\n chat.client.getUserId = function (ruserid)\r\n {\r\n $(\"#loga\").attr(\"src\", \"@ViewBag.Url\" + ruserid);\r\n }\r\n chat.client.userLoginSuccessful = function (r, userid) {\r\n if (r) {\r\n location.href = \"\/Home\/\";\r\n })\r\n }\r\n };\r\n });\r\n\r\n&lt;\/script&gt;&lt;header&gt;\r\n&nbsp;&lt;a&gt;\r\n&nbsp;&lt;h1&gt;\u7528\u6237\u767b\u5f55&lt;\/h1&gt;\r\n&lt;\/a&gt;&lt;\/header&gt;&lt;p&gt;&lt;\/p&gt;\r\n\u8bf7\u4f7f\u7528\u5fae\u4fe1\u767b\u5f55\u626b\u63cf\u4ee5\u4e0b\u4e8c\u7ef4\u7801\u751f\u4ea7\u56fe\u7247\r\n&lt;p&gt;\r\n&nbsp;@@##@@\r\n&lt;\/p&gt;<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p><img><\/p>\n<p>GetOpenIDByCode(code)\u65b9\u6cd5<\/p>\n<p>\u5bf9\u4e8e\u5df2\u5173\u6ce8\u516c\u4f17\u53f7\u7684\u7528\u6237\uff0c\u5982\u679c\u7528\u6237\u4ece\u516c\u4f17\u53f7\u7684\u4f1a\u8bdd\u6216\u8005\u81ea\u5b9a\u4e49\u83dc\u5355\u8fdb\u5165\u672c\u516c\u4f17\u53f7\u7684\u7f51\u9875\u6388\u6743\u9875\uff0c\u5373\u4f7f\u662fscope\u4e3asnsapi_userinfo\uff0c\u4e5f\u662f\u9759\u9ed8\u6388\u6743\uff0c\u7528\u6237\u65e0\u611f\u77e5\u3002 &nbsp;<\/p>\n<p>\u5177\u4f53\u800c\u8a00\uff0c\u7f51\u9875\u6388\u6743\u6d41\u7a0b\u5206\u4e3a\u56db\u6b65\uff1a<br \/>1\u3001\u5f15\u5bfc\u7528\u6237\u8fdb\u5165\u6388\u6743\u9875\u9762\u540c\u610f\u6388\u6743\uff0c\u83b7\u53d6code&nbsp;&nbsp;<br \/>2\u3001\u901a\u8fc7code\u6362\u53d6\u7f51\u9875\u6388\u6743access_token\uff08\u4e0e\u57fa\u7840\u652f\u6301\u4e2d\u7684access_token\u4e0d\u540c\uff09&nbsp;&nbsp;<br \/>3\u3001\u5982\u679c\u9700\u8981\uff0c\u5f00\u53d1\u8005\u53ef\u4ee5\u5237\u65b0\u7f51\u9875\u6388\u6743access_token\uff0c\u907f\u514d\u8fc7\u671f&nbsp;&nbsp;<br \/>4\u3001\u901a\u8fc7\u7f51\u9875\u6388\u6743access_token\u548copenid\u83b7\u53d6\u7528\u6237\u57fa\u672c\u4fe1\u606f\uff08\u652f\u6301UnionID\u673a\u5236\uff09 &nbsp;<\/p>\n<pre>&nbsp;public&nbsp;static&nbsp;string&nbsp;GetOpenIDByCode(string&nbsp;code)\r\n&nbsp;{\r\n&nbsp;string&nbsp;url&nbsp;=string.Format(&nbsp;\"https:\/\/api.weixin.qq.com\/sns\/oauth2\/access_token?appid={0}&amp;amp;secret={1}&amp;amp;code={2}&amp;amp;grant_type=authorization_code\",AppID,AppSecret,&nbsp;code);\r\n&nbsp;using&nbsp;(System.Net.WebClient&nbsp;client&nbsp;=&nbsp;new&nbsp;System.Net.WebClient())\r\n&nbsp;{\r\n&nbsp;string&nbsp;tempstr=&nbsp;client.DownloadString(&nbsp;url);\r\n&nbsp;var&nbsp;regex=&nbsp;new&nbsp;Regex(@\"\"\"openid\"\":\"\"[^\"\"]+?\"\",\",&nbsp;RegexOptions.IgnoreCase);\r\n&nbsp;string&nbsp;tempstr2=&nbsp;regex.Match(tempstr).Value;\r\n&nbsp;return&nbsp;tempstr2.Substring(10,&nbsp;tempstr2.Length&nbsp;-&nbsp;12);\r\n&nbsp;}\r\n&nbsp;}<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236<br \/>\n<img decoding=\"async\" src=\"https:\/\/img.php.cn\/upload\/article\/000\/001\/505\/2e66676a6f8996475626628c1a499637-7.png\" style=\"max-width:90%\" class=\"aligncenter\" title=\".NET C#\u4f7f\u7528\u5fae\u4fe1\u516c\u4f17\u53f7\u767b\u5f55\u7f51\u7ad9\u7684\u5b9e\u4f8b\u89e3\u6790\u63d2\u56fe7\" alt=\".NET C#\u4f7f\u7528\u5fae\u4fe1\u516c\u4f17\u53f7\u767b\u5f55\u7f51\u7ad9\u7684\u5b9e\u4f8b\u89e3\u6790\u63d2\u56fe7\" \/> <\/p>\n<p>\u4ee5\u4e0a\u5c31\u662f.NET C#\u4f7f\u7528\u5fae\u4fe1\u516c\u4f17\u53f7\u767b\u5f55\u7f51\u7ad9\u7684\u5b9e\u4f8b\u89e3\u6790\u7684\u8be6\u7ec6\u5185\u5bb9\uff0c\u66f4\u591a\u8bf7\u5173\u6ce8\u7c73\u4e91\u5176\u5b83\u76f8\u5173\u6587\u7ae0\uff01<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u8fd9\u7bc7\u6587\u7ae0\u4e3b\u8981\u4ecb\u7ecd\u4e86.net \u4f7f\u7528\u5fae\u4fe1\u516c\u4f17\u53f7\u767b\u5f55\u7f51\u7ad9\uff0c\u6559\u5927\u5bb6\u5229\u7528\u5fae\u4fe1\u516c\u4f17\u53f7\u8fdb\u884c\u7f51\u7ad9\u767b\u5f55\uff0c\u611f\u5174\u8da3\u7684\u5c0f\u4f19\u4f34\u4eec\u53ef\u4ee5\u53c2\u8003\u4e00\u4e0b \u9002\u7528\u4e8e\uff1a\u672c\u6587\u9002\u7528\u4e8e\u6709\u4e00\u5b9a\u5fae\u4fe1\u5f00\u53d1\u57fa\u7840\u7684\u7528\u6237\u3000\u3000 \u5f15\u8a00\uff1a\u82b1\u4e86300\u5927\u6d0b\u7533\u8bf7\u4e86\u5fae\u4fe1\u516c\u4f17\u5e73\u53f0\u540e\uff0c\u53d1\u73b0\u4e0d\u80fd\u4f7f\u7528\u5fae\u4fe1\u516c\u4f17\u53f7\u767b\u5f55\u7f51\u7ad9(\u975e\u5fae\u4fe1\u6253\u5f00)\u83b7\u5f97\u5fae\u4fe1\u5e10\u53f7\u3002\u4ed4\u7ec6\u7814\u7a76\u540e\u624d\u53d1\u73b0\u8fd8\u8981\u518d\u82b1300\u5927\u6d0b\u7533\u8bf7\u5fae\u4fe1\u5f00\u653e\u5e73\u53f0\u624d\u80fd\u63a5\u5165\u7f51\u7ad9\u7684\u767b\u5f55\u3002\u4e8e\u662f\u505a\u4e3a\u5c4c\u4e1d\u7a0b\u5e8f\u5458\u7684\u6211\u60f3\u5230\u4e86\u81ea\u5df1\u505a\u4e00\u4e2a\u767b\u5f55\u63a5\u53e3\u3002 \u5de5\u5177\u548c\u73af\u5883\uff1a1. VS2013 .net4.0 C# MVC4.0 Razor2.\u63d2\u4ef6A. Microsoft.AspNet.SignalR;\u65f6\u65f6\u83b7\u53d6\u540e\u53f0\u6570\u636eB.Gma.QrCodeNet.Encoding;\u6587\u672c\u751f\u6210\u4e8c\u7ef4\u7801&nbsp; \u5b9e\u73b0\u7684\u76ee\u68071. \u5728\u7535\u8111\u4e0a\u6253\u5f00\u7f51\u7ad9\u767b\u5f55\u9875\uff0c\u63d0\u793a\u7528\u6237\u4f7f\u7528\u5fae\u4fe1\u626b\u63cf\u767b\u5f55\u786e\u8ba4\u30022.\u7528\u6237\u901a\u8fc7\u5fae\u4fe1\u626b\u63cf\u786e\u8ba4\u540e\uff0c\u7535\u8111\u81ea\u52a8\u6536\u5230\u786e\u8ba4\u4fe1\u606f\u8df3\u8f6c\u5230\u7f51\u7ad9\u4e3b\u9875\u3002&nbsp; \u539f\u7406\u5206\u6790&nbsp;1.SignalR\u662f\u4e00\u4e2a\u795e\u5947\u7684\u5de5\u5177\uff0c\u80fd\u4ece\u6d4f\u89c8\u5668A\u53d1\u9001\u4fe1\u606f\u5230\u670d\u52a1\u5668\uff0c\u670d\u52a1\u5668\u81ea\u52a8\u63a8\u9001\u6d88\u606f\u5230\u6307\u5b9a\u7684\u6d4f\u89c8\u5668B\u3002\u90a3\u4e48\u6211\u7684\u8ba1\u5212\u662f\u7528\u7535\u8111\u7684\u6d4f\u89c8\u5668\u6253\u5f00\u767b\u5f55\u9875\uff0c\u751f\u6210\u4e00\u4e2a\u4e8c\u7ef4\u7801(\u5185\u5bb9\u4e3a\u5e26\u6709\u5fae\u4fe1\u516c\u4f17\u5e73\u53f0\u7f51\u9875\u7528\u6237\u53d7\u6743\u7684\u7f51\u5740)\uff0c\u7528\u5fae\u4fe1\u7684\u63cf\u7801\u529f\u80fd\u6253\u5f00\u8fd9\u4e2a\u7f51\u7ad9\u3002\u5c06\u83b7\u53d6\u7684\u5fae\u4fe1\u7528\u6237OPENID\u901a\u8fc7SignalR\u53d1\u9001\u5230\u7535\u8111\u6d4f\u89c8\u5668\uff0c\u5b9e\u73b0\u767b\u5f55\u529f\u80fd &nbsp;\u5b9e\u73b0\u8fc7\u7a0b1.\u5fae\u4fe1\u516c\u4ece\u5e73\u53f0\u7684\u6ce8\u518c\u548c\u6743\u9650(\u7565\u8fc7&#8230;)2.VS2013\u4e2d\u65b0\u5efaMVC\u7f51\u7ad9,\u6211\u7528\u7684\u73af\u5883\u4e3a.NET4.0 C# MVC4.0&nbsp; Razor\u5f15\u64ce(\u4e2a\u4eba\u4e60\u60ef)\u3002 3.\u5b89\u88c5 SignalR&nbsp;VS2013 \u70b9\u51fb\u5de5\u5177 ==&gt; \u5e93\u7a0b\u5e8f\u5305\u7ba1\u7406\u5668 ==&gt; \u7a0b\u5e8f\u5305\u7ba1\u7406\u63a7\u5236\u53f0 &nbsp;\u8f93\u5165\u4ee5\u4e0b\u547d\u4ee4:&nbsp;Install-Package Microsoft.AspNet.SignalR -Version 1.1.4&nbsp; .net4.0 Mvc4\u73af\u5883\u4e0b\u5efa\u8bae\u5b89\u88c51.1.4\u9ad8\u7248\u672c\u5b89\u88c5\u4e0d\u4e0a &nbsp;\u5b89\u88c5 SingnalR\u6210\u529f&nbsp; \u8bbe\u7f6eSignalR var config = new Microsoft.AspNet.SignalR.HubConfiguration();&nbsp;config.EnableCrossDomain = true;&nbsp;RouteTable.Routes.MapHubs(config);&nbsp; \u65b0\u5efa\u4e00\u4e2a\u7c7b PushHub.cs&nbsp; using&nbsp;Microsoft.AspNet.SignalR; using&nbsp;Microsoft.AspNet.SignalR.Hubs; using&nbsp;System; using&nbsp;System.Collections.Generic; using&nbsp;System.Linq; using&nbsp;System.Web; namespace&nbsp;WD.C.Utility { &nbsp;\/\/\/&nbsp;&lt;summary&gt; &nbsp;\/\/\/&nbsp;\u6807\u6ce8Single&nbsp;javascription\u8981\u8fde\u63a5\u7684\u540d\u79f0 &nbsp;\/\/\/&nbsp;&lt;\/summary&gt; &nbsp;[HubName(&#8220;pushHub&#8221;)] [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[19],"tags":[],"class_list":["post-29795","post","type-post","status-publish","format-standard","hentry","category-19"],"_links":{"self":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/29795","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/comments?post=29795"}],"version-history":[{"count":0,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/29795\/revisions"}],"wp:attachment":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/media?parent=29795"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/categories?post=29795"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/tags?post=29795"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}