問題タブ [system.net.websockets]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
.net - ClientWebSocket に「User-Agent」HTTP ヘッダーを設定する
オブジェクトに"User-Agent" HTTP ヘッダーを設定する必要がありClientWebSocket
ますが、それができません。はありますが、ClientWebSocket.SetRequestHeader(header,value)
そのヘッダーを設定しようとすると、メソッドは失敗します。System.ArgumentException: This header must be modified using the appropriate property or method.
ソース コードを見るとClientWebSocket
、MS の人々はこれを完全に忘れているようです。
したがって、私が見る唯一の方法は、このメソッドをリフレクションに置き換えて、コードを適切に書き直すことです (特別なヘッダーをチェックし、のような特別なプロパティを使用しますhttpWebRequest.UserAgent
)。
他に良いアイデアはありますか?
asp.net - IIS で Websocket トラフィックをトレースする方法
私は IIS 10 を使用しており、.NET 4.5.2 WebSocket を出入りするトラフィックを追跡する必要があります。これは、誰かがサーバーに対して websocket を開いたときに作成されますが、これはまったく不可能のようです。
現在のトレース構成は、System.Net、System.Net.Http、System.Net.Sockets、および System.Net.WebSockets を記録しています。
これらは NLog ターゲットに書き込まれます。サーバーが Redis や Azure Storage などの他のソケットからデータを送受信するたびに、ログにトレースが記録されます。
ただし、クライアントがサーバーに接続すると、WebSocket を開くときに http トレースが取得されますが、クライアントとサーバー間のデータのトレースは取得されません。
問題は基本的に、IIS が AspNetWebSocketContext.WebSocket に関するトレースに実際に何かを書き込むかどうかです。もしそうなら、どうすればこのデータを記録できますか?
私の構成を明確にするために、Nlog config:
そして web.config の関連部分
c# - ASP.NET MVC Websocket サーバー (WebAPI) ハンドシェイクは完了しますが、OnOpen およびその他のイベント関数はサーバー側にヒットしません
注: ASP.NET コミュニティのより幅広い聴衆にヒットすると信じているため、これに C# のタグを付けています。これが問題である場合はお知らせください。削除できます (C# は私の優先言語ですが、このプロジェクトでは私がVBで書くことを余儀なくされています)。websocket サーバーは VB.NET ASP.NET WebApi で作成されています。どんな助けでもいただければ幸いです。
接続を開いたままにし、クライアントからサーバーに簡単な文字列メッセージを送信したいだけです。サーバー コードをできる限り単純化して、以下に全文を掲載しました。
以下は私のサーバー コードです: 注: スタック オーバーフローのコード ブロックで文字列として表示されていたため、コメントを VB の "'" から C# の "//" に変更しました。
成功した握手:
実行すると、この行が (コンストラクターと同様に) ヒットし、エラーが発生しないため、ハンドシェイクは成功したように見えます。
クライアント側のonOpen()関数がヒットし、1 であるreadystateが書き出されます。ただし、onOpen() で 2 行目がヒットすると、何らかの理由で websocket がすぐに閉じます ( onClose()ハンドラーにジャンプします) 。
質問:
ChatWebSocketHandler.OnOpen() (下部のサーバー コードを参照) はヒットしません。実際、ハンドシェイク中にコンストラクターを除いて、そのクラスのメソッド ( OnClose()、 OnError()など) がヒットすることはありません。なぜこれらはヒットしないのですか?
websocket.send()行にブレークポイントを設定すると、その行が実行される前の readystate はまだ 1 であり、その行でエラーにはならず、単純にwebsocket.onClose()イベントにジャンプすることに注意してください。 .
助けてくれてありがとう!必要に応じて、クライアント側の詳細を投稿できます。
c# - Web ソケットに基づいてオンプレミス API に HTTP Web 要求を中継する方法
次の図で表される問題を整理するために、アーキテクチャを実装する必要があります。
基本的にはパブリック API をクラウド (Azure) にデプロイする必要がありますが、データはオンプレミスのマシンにあります。オンプレミス マシンは、データを提供する Swagger API を公開します。各オンプレミス マシンには、要求をルーティングできる一意の識別子 (インストール識別子) があります。
次のリンクで提案されているアプローチに従って、Azure Service Bus の Relay モジュールに基づくソリューションを開発しました。
Azure Service Bus の Relay モジュールに基づくソリューションは、私の問題を整理し、ほとんどのニーズに適合しますが、1 つの問題があります。それは、待ち時間がひどいことです。
パブリック API とサービス バス エンドポイントを同じ地理的リージョンにデプロイしました。単純なリクエスト GET /companies には平均で 1.5 秒かかります。オンプレミス API での処理時間は非常に短く、わずか数ミリ秒です。
レイテンシを低く抑えるために、Web ソケットを使用することを考えていましたが、パブリック API へのリクエストごとに Web ソケット チャネルを開く必要があるため、シナリオを念頭に置いた最善のアプローチかどうかはわかりません。 ApiController 内のオンプレミス API に接続し、そのライフサイクルを処理します (応答を返す前に閉じます)。
明らかに、このシナリオでは、オンプレミス API の各 ApiController は、Web ソケットと http を同時にサポートする必要があります。
別の解決策として、元のリクエストをパブリック API からオンプレミス API に中継する HTTP プロキシを実装することもできますが、私の観点からは、中間に接続マネージャーを使用せずに P2P 通信を使用して、可能な限り最高のレイテンシーを実現できます。 、そのため、私の焦点は現在 Web ソケットにあります。
できるだけ標準に準拠したいので、「純粋な」Web ソケットを使用したいので、Signalr を使用しないことを意味します。
問題、解決策、および代替案を明らかにしたら、私の質問は次のとおりです。
ApiController クラスのアクション メソッド内で Web ソケットを開き、元の http 要求をパブリック API からオンプレミス API に中継するにはどうすればよいですか?
オンプレミス API で HTTP と WebSocket の両方のプロトコルをサポートするにはどうすればよいですか? オンプレミス API は、HTTP 要求だけでなく WebSocket 要求も処理できる必要があります。
私の最初の賭けは System.Net.WebSockets を使用することですが、ASP.NET Web API と統合されたときに役立つ websockets ライブラリが存在するかどうかを知りたいです。