2016-09-01 9 views
0

Azureで実行中のコンソールアプリケーション(webjob)が、Azureで実行中のAPIを呼び出しています。コンソールアプリケーションは、csvファイルからメッセージを投稿します。 ローカル(Windows 10)マシン(azureで実行中のapi)からコンソールアプリケーションを実行すると、期待通りに動作します(エラーなし)。 私は(紺碧で実行されているAPIを持つ)のAzureでコンソールアプリケーションを実行すると、それは約980件のメッセージを処理し、httpclient PostAsJsonAsync errors after(n)messages after(ポート枯渇)

エラーエラーを報告して開始します。

  • を「要求を送信中にエラーが発生しました」

「リモートサーバーに接続できません」私は、コンソールアプリケーションをAzureの中で実行されているいくつかの理由でポートを排出していることを信じているが、私はこれを解決する方法がわかりません。 私のファイルの行数は50,000ですが、問題が発生する前には約980にしか達しません。もう一方の端で、apiは受け取ったメッセージをSQLデータベースと紺碧のイベントハブにポストしています。 PostAsJsonAsyncが完了したら、アプリケーションで強制的にポートを解放するにはどうすればよいですか? ポートが解放されたかどうか、またはポートが使用可能であることを確認する方法を確認するにはどうすればよいですか? 私はこれらのエラーが発生している可能性がある他の理由を知っているなら、助けてください。

public async Task<string> PostMessageToAPI(string aMsg) 
{ 
    HttpResponseMessage response = null; 
    string strResponse = "";  
    try 
    { 
     using (var client = new HttpClient()) 
     { 
      client.SetBearerToken("access token here"); 
      client.BaseAddress = new Uri("MyBaseUrl.com"); 
      client.DefaultRequestHeaders.Accept.Clear(); 
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
      using (response = await client.PostAsJsonAsync("my/url/goes/here", anEvent.ToLower())) 
      { 
       if (response != null) 
       { 
        if (response.StatusCode != HttpStatusCode.OK) 
        { 
         throw new HttpRequestException(response.ReasonPhrase); 
        } 
        else 
        { 
         return await response.Content.ReadAsStringAsync(); 
        } 
       } 
      } 
     } 
    } 
    catch (HttpRequestException ex) 
    {  
     // exception message states: "An error occurred while sending the request" 
    } 
    return strResponse;   
} 
  • のVisual Studio 2015更新3
  • .NET 4.5.1
  • Azureのコンソールアプリケーションの計画:基本的な小1
  • AzureのAPIのAppプラン:ここ

    は私のコードです基本1小

+0

PostMessageToAPI'は、マルチスレッド環境から呼び出さ 'ですか? – Stefan

+0

これはAzure WebJobから呼び出されるため、複数のインスタンスを呼び出すことができますが、これはAzureによって管理されます。私はしかし、ただ1つのインスタンスをテストしています。 –

+0

誰がリモートサーバにいますか?その端の接続が正しく切断されていない可能性はありますか? – Stefan

答えて

-1

HttpClient wrapp usingで編集。静的インスタンスを使用して共有します。

public class MyClass() 
{ 
private HttpClient client = null; 
public MyClass(){ 
    client = new HttpClient(); 
    client.SetBearerToken("access token here"); 
    client.BaseAddress = new Uri("MyBaseUrl.com"); 
    client.DefaultRequestHeaders.Accept.Clear(); 
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

} 
public async Task<string> PostMessageToAPI(string aMsg) 
{ 
    HttpResponseMessage response = null; 
    string strResponse = "";  
    try 
    { 
     using (var response = await client.PostAsync("my/url/goes/here", new StringContent(aMsg, Encoding.UTF8, "application/json"))) 
     { 
      if (response != null) 
      { 
       if (response.StatusCode != HttpStatusCode.OK) 
       { 
        throw new HttpRequestException(response.ReasonPhrase); 
       } 
       else 
       { 
        return await response.Content.ReadAsStringAsync(); 
       } 
      } 
     } 

    } 
    catch (HttpRequestException ex) 
    {  
     // exception message states: "An error occurred while sending the request" 
    } 
    return strResponse;   
} 
} 

あなたも、クラスの同じインスタンスを共有できる点が、ソケット毎回を再作成して再開する最適ではなく、ですが、それは最終的にあなたのコールのスループットに応じて、ソケットの枯渇につながります。

Source

+0

注:実際にはスレッドセーフです(https:// msdn.microsoft.com/en-us/library/system.net.http.httpclient(v=vs.110).aspx#Anchor_5) 'CancelPendingRequests'、' DeleteAsync'、 'GetAsync'、' GetByteArrayAsync'、 'GetStreamAsync' 、GetStringAsync'、 'PostAsync'、' PutAsync'、 'SendAsync'のようなものです。いずれのプロパティもスレッドセーフであることは保証されていません。あなたの 'PostAsJsonAsync'拡張メソッドがそのリストにないメソッドを使わず、どのプロパティも使用していないことを確認してください。 –

+0

いいキャッチ!私はちょうど静的な使用のためのコードを移植した、それはポート枯渇の背後にある理由です。 –

+0

こんにちはMatias、問題は、私はすべての呼び出しのために新たにhttpclientを作成していたということでした。私は今、すべての呼び出しに同じhttpclientを再利用するため、問題は解決されています。これは本質的にあなたのコードで説明したものですので、ありがとうございます。あなたの答えを解決策としてマークしました。 –