

W10 PCでNodeJS serverを作成しましたが、そこから（同じPC内の）C#
Windowsフォームアプリケーションで作成した印刷アプリへデータを送りたいのですがどのようにすれば良いでしょうか？

自分が考えた方法は印刷アプリ側にHTTP server機能を持たせ、NodeJS
serverからPOST通信でデータを送るというもので、このサイトはじめいくつか調べてみましたが、私には難易度が高く、内容が断片的にしか理解できませんでした。  
初心者（visualstudio/c#の学習期間は半年くらい）に理解できそうなサイトや技術情報等ありましたらご教授ください。


CC BY-SA 4.0
2020-10-13T02:31:26.147
71156
2021-02-23T18:16:07.797
2021-02-23T18:16:07.797
19110
42297
question
c# http
C# Windowsフォームアプリケーションへデータを送れるようにしたい


Windowsフォームのアプリケーションにデータを届ける方法として、HTTP通信以外の気軽なアイディアとしてはFTPサーバや共有フォルダを作成してファイルを渡してみるのはどうでしょうか？

[code]

    Node.jsアプリ --> FTPサーバ/共有フォルダ --> Windowsフォームアプリ
    
[/code]

この別のバリエーションとしては、WindowsフォームアプリからNode.jsアプリに新しいファイルの有無を問い合わせることもできます。このときのNode.jsアプリは、ファイルがあるときはHTTP応答としてファイルを、ファイルがないときはHTTPコード
404 を返却するようなイメージです。

[code]

    Windowsフォームアプリ --> (POSTまたはGET) --> Node.jsアプリ
    
[/code]

今回考えてみたどちらのアイディアもWindowsフォームアプリが周期的に新しいファイルの有無を確認します。確認の頻度を高めればリアルタイム風の動作になりますが、あまりたくさんの問い合わせを受けると、FTPサーバ、共有フォルダ、Node.jsアプリが負荷に耐えられないかもしれません。このアイディアを試すのであれば、緩やかな確認頻度にするのがおすすめです。

追記：  
どちらのアプリケーションも同じコンピュータで動作しているとのこと。  
それであれば、FTPサーバや共有フォルダではなく、ローカルフォルダを決めておいてファイルをやりとりできそうです。


CC BY-SA 4.0
2021-02-23T06:59:51.450
74223
2021-02-23T07:10:33.603
2021-02-23T07:10:33.603
44083
44083
71156
answer


Windows アプリの中で ASP.NET Core の HTTP サーバーを [セルフホスト] する方法を使うと  
HTTP POST データを受信する事ができるようになります。

.NET Framework 4 の場合と .NET Core の場合で 利用する コンポーネントが微妙に違います。

### .NET Framework 4 以降 の場合

<https://docs.microsoft.com/en-us/aspnet/web-api/overview/hosting-aspnet-web-
api/use-owin-to-self-host-web-api>

を参考にしました。

`Microsoft.AspNet.WebApi.OwinSelfHost` nuget パッケージを追加して

Program.cs を

[code]

        static class Program
        {
            /// <summary>
            /// アプリケーションのメイン エントリ ポイントです。
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
    
                string baseAddress = "http://localhost:9000/";
    
                // Start OWIN host 
                using (WebApp.Start<Startup>(url: baseAddress))
                {
                    // Create HttpClient and make a request to api/values 
                    HttpClient client = new HttpClient();
    
                    var response = client.GetAsync(baseAddress + "api/values").Result;
    
                    Console.WriteLine(response);
                    Console.WriteLine(response.Content.ReadAsStringAsync().Result);
    
                    mainForm = new Form1();
                    Application.Run(mainForm);
                }
            }
    
            public static Form1 mainForm;
        }
    
        public class Startup
        {
            // This code configures Web API. The Startup class is specified as a type
            // parameter in the WebApp.Start method.
            public void Configuration(IAppBuilder appBuilder)
            {
                // Configure Web API for self-host. 
                HttpConfiguration config = new HttpConfiguration();
                config.Routes.MapHttpRoute(
                    name: "DefaultApi",
                    routeTemplate: "api/{controller}/{id}",
                    defaults: new { id = RouteParameter.Optional }
                );
    
                appBuilder.UseWebApi(config);
            }
        }
    
        public class ValuesController : ApiController
        {
            // GET api/values/5 
            public string Get(string name)
            {
                Program.mainForm.InvokeAddMessage("get " + name);
                return "hello " + name;
            }
    
            // POST api/values 
            public void Post([FromBody] string value)
            {
                Program.mainForm.InvokeAddMessage(value);
            }
        }
    
[/code]

と 書き換えて  
Form1.cs に

[code]

            public void InvokeAddMessage(string value)
            {
                if (this.InvokeRequired)
                {
                    this.Invoke((MethodInvoker)delegate { InvokeAddMessage(value); });
                }
                else
                {
                    this.textBox1.Text = value;
                }
            }
    
[/code]

メソッドを追加します。

http://localhost:9000/api/Values/test

を ブラウザで開くと Windows Form に

[code]

    hello test
    
[/code]

と表示されます。

### .NET Core 5.0 の場合

<https://github.com/tonysneed/Demo.DotNetSelfHost>

のサンプルを参考に作成すればよいと思います。


CC BY-SA 4.0
2021-02-23T17:17:13.360
74237
2021-02-23T17:17:13.360
18851
71156
answer