問題タブ [dotnet-httpclient]
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.
c# - 複数の HTTP リクエストを並行して実行しようとしているが、Windows (レジストリ) によって制限されている
単純な HTTP 要求を介してサード パーティからルックアップ機能にアクセスするアプリケーション (winforms C# .NET 4.0) を開発しています。パラメータを指定して URL を呼び出すと、ルックアップの結果として小さな文字列が返されます。十分に単純です。
ただし、課題は、これらのルックアップを多数 (数千回) 行う必要があることであり、必要な時間を制限したいと考えています。したがって、リクエストを並行して実行したいと思います(たとえば、10-20)。これを行うために ThreadPool を使用します。コードの短いバージョンは次のようになります。
別の場所からnumbersToLookup
(a ) を入力し、呼び出してコールバック関数を提供し、各結果を返します。これは機能しますが、必要なスループットが得られないことがわかりました。List<String>
startAsyncLookup
returnLookupResult
最初は、サードパーティのシステムが貧弱である可能性があると考えていましたが、2 台の異なるマシンから同じコードを同時に実行しようとすることで、これを除外しました。2 人それぞれが 1 人で行ったのと同じくらい時間がかかったので、その 1 人を除外することができました。
同僚は、これが Windows の制限である可能性があることを教えてくれました。少しグーグルで検索したところ、この投稿の中で、デフォルトで、Windows は同じ Web サーバーへの同時リクエストの数を HTTP 1.0 では 4 に、HTTP 1.1 では 2 に制限していることがわかりました (HTTP 1.1 の場合、これは実際には仕様に従っています ( RFC2068)))。
上記の同じ投稿でも、これらの制限を引き上げる方法が提供されていました。(MaxConnectionsPerServer と MaxConnectionsPer1_0Server) に2 つのレジストリ値を追加すること[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
で、これを自分で制御できました。
それで、私はこれを試し(両方とも20歳まで座った)、コンピューターを再起動し、プログラムを再度実行しようとしました。悲しいことに、それは何の助けにもならなかったようです。また、バッチ ルックアップの実行中にリソース モニターを監視していたところ、アプリケーション (タイトルが塗りつぶされているアプリケーション) がまだ 2 つの TCP 接続しか使用していないことに気付きました。
では、問題は、なぜこれが機能しないのかということです。リンク先の投稿は、間違ったレジストリ値を使用していますか? これはおそらく、もはや Windows で「ハッキング」することはできないのでしょうか (私は Windows 7 を使用しています)。
また、誰かが疑問に思う場合に備えて、ThreadPool の MaxThreads のさまざまな設定 (10 から 100 までのすべて) も試してみましたが、これはスループットにまったく影響を与えていないようでした。
.net - HttpClient を使用して、XDocument をリクエスト ストリームに直接保存するにはどうすればよいですか?
HttpWebRequest を使用すると、XDocument.Save() を呼び出して、要求ストリームに直接書き込むことができます。
で同じことを行うことは可能HttpClient
ですか? 真っ直ぐな方法は、
しかし、これにより、 に の別のコピーが作成XDocument
されMemoryStream
ます。
asp.net-web-api - HttpReponseMessage で応答 Cookie を設定するにはどうすればよいですか?
Web API でデモ ログイン サービスを作成したいのですが、応答に Cookie を設定する必要があります。それ、どうやったら出来るの?または、承認を行うためのより良い方法はありますか?
c# - HttpClient で await を使用した非同期呼び出しが返されない
C#
Win8 CP 上の xamlベースのメトロ アプリケーション内から呼び出しを行っています。この呼び出しは単に Web サービスをヒットし、JSON データを返します。
でハングしますawait
が、http呼び出しは実際にはほとんどすぐに返されます (フィドラーで確認)。あたかもawait
が無視され、そこにぶら下がっているかのようです。
質問する前に- はい - プライベート ネットワーク機能がオンになっています。
これがハングする理由はありますか?
c# - WebRequest.CachePolicyは、IIS内で実行されているコードから機能する必要がありますか?
ApiController(ASP.Net Web API)内で実行されているコードがあり、それ自体が別のWebサービスに対してGET要求を行います。Webサービス(これも私のアプリの一部)は、返すコンテンツの有効期限を示すCache-Controlヘッダーを返します。
クライアント側のキャッシュを使用するためにSystem.Net.Http.HttpClient
で構成された新しいを使用しています(デフォルトでは、基になるHTTP実装として使用されますが、キャッシュ構成はサポートされていません)。WebRequestHandler
HttpClientHandler
System.Net.WebRequest
サーバー上で、コントローラーアクション内でキャッシュを有効にしています...
上記の(省略された)コードは、テスト内で正しく機能します。この方法でサービスに複数の呼び出しを行い、最初の呼び出しのみが実際にサービスに接続します(IISのサービスのログメッセージで確認できます)。以降の呼び出しではキャッシュが使用されます。
ただし、IIS自体でホストされている同じコードを実行するとHttpClient
、キャッシュ結果が無視され(AppDomainにインスタンスが1つだけ存在するようにIoCコンテナーも設定しましHttpClient
た)、毎回サービスを呼び出すようです。これはAppPoolIdentityとして実行されています。
興味深いことに、ネットワークサービスとして実行するようにアプリプールを変更すると、応答のステータスコードは401 Unauthorizedになります(設定を試みPreauthenticate = true
ましたWebRequestHandler
が、ステータスコードはまだ401です)。自分の資格情報で実行するようにアプリプールを変更した場合も同じです。
それで、NetworkServiceIDと仮想AppPoolIdentityの下でAppPoolを実行することについて、クライアント側のキャッシュを使用できないようにする何かがありますか。WebRequest
とにかく、物理的 にキャッシュされたコンテンツはどこに存在しますか?
c# - HttpClient 認証ヘッダーが送信されない
HttpClient
基本的な HTTP 認証を必要とするサードパーティ サービスにを使用しようとしています。を使用していAuthenticationHeaderValue
ます。これが私がこれまでに思いついたものです:
POST アクションは正常に動作しているように見えますが、期待するデータが返されません。試行錯誤を繰り返し、最終的に Fiddler を使用して生のトラフィックを盗聴した結果、認証ヘッダーが送信されていないことがわかりました。
これを見たことがありますが、AuthenticationHeaderValue
コンストラクターの一部として指定された認証スキームを持っていると思います。
見逃したものはありますか?
c# - マルチスレッドとイベント
マルチスレッドとイベントに問題があります。
いくつかのスレッドで実行される次の関数があります。
次のように呼び出されます。
私が直面している問題(私は思う)は、その後
私のスレッドはキャンセルされます。タスクが閉じられたことを示す AggregateException を取得しているので、これが問題であるに違いないと思います。私が達成したいことは次のとおりです。私の関数、つまり現在のスレッドは、そのイベントが発生するまでブロックする必要があります:
これに対する解決策はありますか?コードを教えてください。
編集:
これは GetProjectInfo メソッドです。
そして、そこに AggregateException を取得します。
これは例外です:
asp.net-web-api - ASP.NET Web API メッセージ ハンドラー
カスタム メッセージ ハンドラの実行順序を制御することはできますか?
たとえば、ロギング ハンドラを最初に実行する場合は、常にリクエストをログに記録します。
ロギング ハンドラを最後に追加する以外に、これを達成する方法がわかりません。
.net - 頻繁に使用されているときに HttpClient.PostAsync がすべての一時ポートを使い果たすのを防ぐにはどうすればよいですか?
RESTful サービスへの一括アップロードを行う .NET コンソール アプリケーションがあります。HttpClient
サービスとの通信に使用しています。デフォルトでは、 はHttpClient
を使用しHttpWebRequest
て接続を確立します。私は一度に 1 つの接続を行っています。4000 件近くのリクエストにヒットすると、リクエストが失敗し始め、それを説明するエラーが発生します -
..システムに十分なバッファ スペースがないか、キューがいっぱいでした。
これは、4000 件のリクエストを行う直前に XP がエフェメラル ポートを使い果たしたためだと思います。
アプリの実行中に netstat を見ると、サービスへの約 300 の接続が「確立済み」であることがわかります。一度に 1 つの接続しか作成していません。接続は最終的に明らかに閉じられていますが、これらの接続がより早く閉じられるようにするために何かをする必要がありますか?
アクティブな接続を見ると、リクエストごとに新しいエフェメラル ポートが使用されていることがわかります。エラーを回避するためにHttpClient.PostAsync()
、同じエフェメラル ポートを再利用する方法はありますか? これほど多くのリクエストを行う正しい方法は何ですか?
一度に 1 つの接続のみを作成するときに使用している理由HttpClient.PostAsync()
は、これを 2 または 3 に増やすつもりだからです。この問題を解決している間、接続を 1 に減らしました。
編集: Windows レジストリのエフェメラル ポートの範囲を拡大することでこの問題を解決できましたが、将来的にリクエストの数が劇的に増加する可能性があるため、コード ベースのソリューションを見つけたいと考えています。
c# - ASP.NET WebApi: WebApi HttpClient を使用してファイル アップロードでマルチパート ポストを実行する方法
次のような単純なフォームからのアップロードを処理する WebApi サービスがあります。
ただし、HttpClient API を使用して同じ投稿をシミュレートする方法がわかりません。少しは簡単ですが、FormUrlEncodedContent
ファイルの内容を名前付きで投稿に追加するにはどうすればよいですか?