2016-02-04 13 views
6

私はRestSharp APIを使用してWebサービスを呼び出していますが、サーバーがRestClientのデフォルトタイムアウト(つまり100秒)よりも時間がかかる場合、常に取得しています。StatusCode = NotFoundハードコードにはTimeoutとReadWriteTimeoutの両方のパラメータ値がありますが、それは役に立ちませんでした。誰かがここで何ができるのかを提案できますか?Windows Phone 8でRestClientのタイムアウトを設定するにはどうすればよいですか?

public static class RestClientExtensions 
{ 
    private static Task<T> GetResponseFromServer<T>(this RestClient client, IRestRequest request, Func<WebDownloadResult, T> selector) 
    { 
     var tcs = new TaskCompletionSource<T>(); 
     WebDownloadResult webResponse = new WebDownloadResult(); 
     var loginResponse = client.ExecuteAsync(request, r => 
     { 

      if (r.ErrorException == null && r.StatusCode == HttpStatusCode.OK) 
      { 
       webResponse.StatusCode = r.StatusCode; 
       webResponse.StatusCodeNumber = (int)r.StatusCode; 
       webResponse.Result = r.Content; 
       webResponse.ErrorOccured = r.StatusCode == HttpStatusCode.OK ? false : true; 
       tcs.SetResult(selector(webResponse)); 
      } 
      else 
      { 
       tcs.SetException(new Exception(r.StatusCode.ToString())); 
      } 

     }); 
     return tcs.Task; 
    } 

    private static Task<T> GetResponseFromServerForMW<T>(this RestClient client, IRestRequest request, Func<WebDownloadResult, T> selector) 
    { 
     var tcs = new TaskCompletionSource<T>(); 
     WebDownloadResult webResponse = new WebDownloadResult(); 
     var loginResponse = client.ExecuteAsync(request, r => 
     { 

      if (r.ErrorException == null && r.StatusCode == HttpStatusCode.OK) 
      { 
       webResponse.StatusCode = r.StatusCode; 
       if (r.Headers.FirstOrDefault(header => header.Name.Equals("P_RET_SYNC_ID")).Value != null) 
       { 
        webResponse.AdditionalParameter = r.Headers.FirstOrDefault(header => header.Name.Equals("P_RET_SYNC_ID")).Value; 

       } 
       webResponse.StatusCodeNumber = (int)r.StatusCode; 
       webResponse.Result = r.RawBytes; 
       webResponse.ErrorOccured = r.StatusCode == HttpStatusCode.OK ? false : true; 
       tcs.SetResult(selector(webResponse)); 
      } 
      else 
      { 
       tcs.SetException(new Exception(r.StatusCode.ToString())); 

      } 

     }); 
     return tcs.Task; 
    } 

    private static Task<T> GetRawResponseFromServer<T>(this RestClient client, IRestRequest request, Func<WebDownloadResult, T> selector) 
    { 
     var tcs = new TaskCompletionSource<T>(); 
     WebDownloadResult webResponse = new WebDownloadResult(); 
     var loginResponse = client.ExecuteAsync(request, r => 
     { 
      if (r.ErrorException == null && r.StatusCode == HttpStatusCode.OK) 
      { 
       webResponse.StatusCode = r.StatusCode; 
       webResponse.StatusCodeNumber = (int)r.StatusCode; 
       webResponse.Result = r.RawBytes; 
       webResponse.ErrorOccured = r.StatusCode == HttpStatusCode.OK ? false : true; 
       tcs.SetResult(selector(webResponse)); 
      } 
      else 
      { 
       tcs.SetException(new Exception(r.StatusDescription)); 
      } 

     }); 
     return tcs.Task; 
    } 

    public static Task<WebDownloadResult> GetResponseAsync(this RestClient client, IRestRequest request) 
    { 
     return client.GetResponseFromServer(request, r => r); 
    } 

    public static Task<WebDownloadResult> GetResponseAsyncForMW(this RestClient client, IRestRequest request) 
    { 
     return client.GetResponseFromServerForMW(request, r => r); 
    } 

    public static Task<WebDownloadResult> GetResponseBytesAsync(this RestClient client, IRestRequest request) 
    { 
     return client.GetRawResponseFromServer(request, r => r); 
    } 


} 

WebDownloadResult以下の通りです:

マイコードはCONN_TIMEOUT = 600000と私の応答処理クラスは以下の通りです

public async Task<WebDownloadResult> SyncMobileData(string encryptedstring) 
    { 
     WebDownloadResult response = new WebDownloadResult(); 
     var client = new RestClient(BaseUrl + Constants.WEB_SERVICE_NAME); 
     client.Timeout = CONN_TIMEOUT; 
     client.ReadWriteTimeout = CONN_TIMEOUT; 
     var request = new RestRequest(Method.POST); 

     byte[] encryptedbytes=System.Text.Encoding.UTF8.GetBytes(encryptedstring); 
     request.AddParameter("", encryptedbytes, ParameterType.RequestBody); 

     try 
     { 
      response = await client.GetResponseBytesAsync(request); 
     } 
     catch (Exception outer) 
     { 
      response.ErrorOccured = true; 
      response.ErrorMessage = outer.Message; 
     } 
     return response; 

    } 

は以下の通りである

public class WebDownloadResult 
{ 
    public HttpStatusCode StatusCode { get; set; } 
    public string ErrorMessage { get; set; } 
    public int StatusCodeNumber { get; set; } 
    public bool ErrorOccured { get; set; } 
    public object Result { get; set; } 
    public object AdditionalParameter { get; set; } 
} 
+0

をあなたはCONN_TIMEOUT = 600000がどのように意味理解しています多くの時間は? StatusCode = NotFoundを意味する404 HTTPサーバーエラー –

+0

CONN_TIMEOUT = 600000を追加しなかったのは10分です。最初は20秒、30秒などで開始しました。サーバーがいくつかの操作を実行するには時間がかかります応答を送ってください。そして、デフォルトのタイムアウトである100秒以上の時間がかかるので、NotFoundエラーが発生しています。他のWebサービスでは完全に動作します。 –

+0

@Romaszここでお手伝いできますか? –

答えて

0

あなたのコードは、おそらくdefault HttpWebRequest.Timeout

を使用していることは、明示的にこのようRestRequestでそれを渡してみてください -

request.AddParameter("Timeout", options.Timeout.Value); 

あなたはこのような改良版試すこと -

var client = new RestClient(baseUrl) 
{ 
    Timeout = someTimeoutInMilliseconds 
}; 

var request = new RestRequest(url) 
{ 
    Method = Method.GET, 
    Timeout = someTimeoutInMilliseconds 
}; 
+0

オプションとは何ですか?投稿には機能しなかったと書かれています。 –

+0

オプションは、タイムアウトを保持する変数です。そして、そのポストは、別の/無関係な問題について話しますが、上にコピーされたコードスタイルは多く管理されています。これらを試す価値があるはずです。 – Arvin

+0

編集されたリンクは無関係のリンクを削除します – Arvin