技術共有

C# は、exe ベースの組み込み HTTPS リスニング サービスを実装し、HTTP から HTTPS バックエンド Windows サービスにアップグレードします。

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

これは、顧客が元の HTTP バックエンド サービスを https をサポートするサービスにアップグレードする必要があるためです。元の HTTP サービスは、WINDOWS サービスの組み込み HTTP リスニング サービスに基づいて実装されており、https をサポートしておらず、他のサービスとも異なるためです。 IIS にデプロイされた WebAPI は、HTTPS 証明書がサービスと同様に直接読み込まれるため、ここで https をサポートするように元のサービスを変更し、サーバー環境で HTTPS ポート バインド設定を実行する必要があります。

(注: 次の操作には、HTTPS 証明書がすでに存在している必要があります。)

1. 証明書をインストールし、pfx ファイルをダブルクリックして、次の場所にインストールします。ローカルコンピュータ”–>“個人的”;

2. ダブルクリックして開きますクリティカル証明書の詳細情報で (certhash) フィンガープリント関連情報を確認できます。

3. ポートバインディングを実行します(デフォルトポート443)。

netsh http add sslcert ipport=0.0.0.0:8080 certhash=指纹 appid={程序GUID/newguid} clientcertnegotiation=enable

4. サーバープログラムの実装:

  1. using System;
  2. public class HttpService
  3. {
  4. public MyHttpServer()
  5. {
  6. System.Net.HttpListener httpListener = new System.Net.HttpListener();
  7. httpListener.AuthenticationSchemes = System.Net.AuthenticationSchemes.Anonymous;
  8. httpListener.Prefixes.Add("https://*:8000/"); // 支持https
  9. httpListener.Start();
  10. new System.Threading.Thread(new System.Threading.ThreadStart(delegate
  11. {
  12. while (true)
  13. {
  14. try
  15. {
  16. System.Net.HttpListenerContext httpListenerContext = httpListener.GetContext();
  17. new System.Threading.Thread(new System.Threading.ParameterizedThreadStart((input) =>
  18. {
  19. System.Net.HttpListenerContext ctx = (System.Net.HttpListenerContext)input;
  20. System.Net.HttpListenerRequest request = ctx.Request;
  21. string pram = request.QueryString["Data"];//Get入参
  22. string responseMessage = string.Empty;//返回值
  23. if (!string.IsNullOrEmpty(pram))
  24. {
  25. //Get入参
  26. pramOrg = pram;
  27. pram = System.Web.HttpUtility.UrlDecode(pram);
  28. }
  29. //POST入参
  30. if (request.HttpMethod == "POST")
  31. {
  32. //处理业务请求
  33. StreamReader reader = new StreamReader(request.InputStream, Encoding.UTF8);
  34. pram = reader.ReadToEnd();
  35. reader.Close();
  36. reader.Dispose();
  37. }
  38. #region 业务处理
  39. try
  40. {
  41. //业务处理
  42. responseMessage = "业务结果";
  43. }
  44. catch (Exception ex)
  45. {
  46. //异常处理
  47. responseMessage = ex.Message;
  48. }
  49. #endregion 业务处理
  50. #region 返回给调用者
  51. //输出类型
  52. httpListenerContext.Response.ContentType = "text/html; charset=UTF-8";
  53. //返回状态
  54. httpListenerContext.Response.StatusCode = 200;
  55. //设置授权,尝试解决Jquery跨域问题
  56. //httpListenerContext.Response.Headers["Access-Control-Allow-Origin"] = "*";
  57. //httpListenerContext.Response.Headers["Access-Control-Allow-Methods"] = "GET,POST";
  58. //httpListenerContext.Response.Headers["Access-Control-Max-Age"] = "1000";
  59. try
  60. {
  61. //输出界面内容
  62. if (!string.IsNullOrEmpty(responseMessage))
  63. {
  64. //返回文本内容
  65. using (StreamWriter writer = new StreamWriter(httpListenerContext.Response.OutputStream))
  66. {
  67. writer.Write(responseMessage);
  68. }
  69. }
  70. }
  71. catch
  72. {
  73. //刷新太快异常,不做处理
  74. }
  75. #endregion 返回给调用者
  76. })).Start(httpListenerContext);
  77. }
  78. catch
  79. { }
  80. }
  81. })).Start();
  82. }
  83. }

上記のポート バインド プロセス中にエラーが報告された場合、または追加が失敗した場合は、次の処理を参照できます。

1. netsh コマンドのパラメータが正しいかどうかを確認します。

2. SSL 証明書の追加に失敗しました。エラー: 1312 指定されたログイン セッションが存在しません。終了している可能性があります。加工方法:

次のように、キーボードの WIN+R を押して mmc.exe と入力します。

    

[OK] をクリックすると、次のコンソール ルート ノード インターフェイスがポップアップ表示されます。

[ファイル] -> [スナップインの追加/削除] を選択するか、ショートカット キー Ctrl+M を直接使用して、次のポップアップを表示し、操作を実行します。

次に個人輸入証明書に進みます

最後にSSL証明書をポート番号にバインドします。

netsh http add sslcert ipport=0.0.0.0:8080 certhash=指纹 appid={程序GUID/newguid} clientcertnegotiation=enable