ASP.NET Web API は初めてで、非常に奇妙な問題に苦しんでいます。
RESTful サービスを呼び出すコードがあり、コンソール プロジェクトからは正常に実行されますが、.NET 4.0 で実行されている MVC4 プロジェクトからは実行できません。
サービスを呼び出すコードは非常に単純です。
internal string Test()
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("https://testserver");
var task = client.GetAsync("/someUri")
var response = task.Result;
response.EnsureSuccessStatusCode();
return response.Content.ReadAsStringAsync().Result;
}
}
前述のように、コンソール プロジェクトから呼び出すと期待どおりに機能し、ミリ秒単位で応答が返されますが、数秒後に MVC4 コントローラーのアクションからメソッドを呼び出すと、次のようなメッセージが表示されます。接続された側が一定時間後に適切に応答しなかったか、接続されたホストが応答しなかったために確立された接続が失敗しました。」
奇妙なことに、MVC4 バージョンをデバッグするとき、タスクのステータスは常に WaitingForActivation と表示されます。
fiddler を実行しても、MVC4 バージョンからのリクエストは表示されませんが、コンソール バージョンでは表示されます。
かなり深刻なグーグル検索の後、この問題を抱えていると思われる人を他に見つけることができないので、根本的に何かを誤解していると推測していますが、現時点では何がわかりません!
2012 年 11 月 9 日 16:55 英国標準時更新
さらに奇妙なことに、新しい MVC4 サイトを作成したところ、問題なくメソッドを呼び出すことができます。現在、サイトを比較しようとしていますが、1 つは MVC4 にアップグレードされた既存のサイトで、もう 1 つは新しい空白のサイトであるため、関連する違いを見つけるのは難しい場合があります。
2012 年 9 月 14 日 16:44 英国標準時更新
これは現在、インフラストラクチャ/ネットワークの問題のように見えます。
プロジェクトを .NET 4.5 で VS2012 にアップグレードしたので、async/await を使用して提案された実装を試し、デッドロックを回避できました。これは何も変わらなかったので、スクエア 1 に戻りました。
新しい MVC4 プロジェクト、新しいサービス ライブラリ、単体テスト プロジェクトを使用して新しいソリューションを作成し、MVC の外部でサービス ライブラリを実行しました。
サービス ライブラリで、公開されている "what's my IP" サービスを呼び出すメソッドと、公開されているが会社の IP アドレスにのみ適切に応答する会社のサービスを呼び出すメソッドを作成しました。
背景として、私は VPN 経由で会社の LAN に接続しています。
VPN から切断されると、単体テストと MVC の両方で、IP サービスは HTTP 200 を応答し、会社のサービスは予想どおり HTTP 404 を応答します。
VPN に接続すると、単体テストは両方とも HTTP 200 を応答し、MVC は両方ともタイムアウトします。
次に、MS Soap Tool をローカルで実行し、それを使用して会社のサービスへの呼び出しをプロキシしました。すべての呼び出し (単体テストまたは MVC からの呼び出し) は要求と応答を示しますが、単体テストは応答を登録しますが、MVC コントローラーは登録しません。
私の他の唯一の考えは、それは返信のサイズと関係があるのではないでしょうか? すべての「成功」には、会社のサービスを呼び出す単体テスト以外の非常に小さな応答がありますか?