【问题标题】:How to set timeout for RestClient in windows phone 8?如何在 Windows Phone 8 中为 RestClient 设置超时?
【发布时间】:2016-05-13 21:11:21
【问题描述】:

我正在使用 RestSharp API 调用 Web 服务。但我面临一个问题,即当服务器花费的时间超过 RestClient 的默认超时时间(即 100 秒)时,我总是得到 StatusCode=NotFound.我还尝试对 Timeout 和 ReadWriteTimeout 参数值进行硬编码,但没有帮助。有人可以建议在这里可以做什么吗?

我的代码如下

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;

    }

其中 CONN_TIMEOUT=600000 和我的响应处理类如下:

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 如下:

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; }
}

【问题讨论】:

  • 你明白 CONN_TIMEOUT=600000 的意思是多少时间吗?你得到了 StatusCode=NotFound 意味着 404 http server error
  • 我没有添加 CONN_TIMEOUT =600000,即 10 分钟,起初,我从 20 秒、30 秒等开始,由于服务器正在执行一些操作,因此发送响应需要一些时间。由于它需要超过 100 秒(默认超时),我收到 NotFound 错误,否则对于其他 Web 服务它可以完美运行。

标签: c# windows-phone-8 restsharp


【解决方案1】:

您的代码可能正在使用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
};

【讨论】:

  • Option 只不过是一个保存超时的变量。尽管复制过来的代码样式得到了很好的管理,但那篇文章谈到了另一个/不相关的问题。这些应该值得尝试。
猜你喜欢
  • 2012-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多