none
HttpClient.SendRequestAsync 会重发请求吗,如果上一次请求失败的话? RRS feed

  • 问题

  • 我们现在的一个windows 项目中有个很奇怪的问题。以下操作都是我只请求一遍

    1。我登陆故意用错误的密码,后台都收到两次请求

    2。我登陆故意用错误的用户名,后台都收到两次请求

    3。我用正确的密码和用户名登录,后台只收到一次请求

    但是后台都是跟IOS同一套逻辑,IOS无论我尝试上面的3个case ,后台都只收到一次请求

    前提:

    private static HttpBaseProtocolFilter filter = new HttpBaseProtocolFilter();

    this.client = new HttpClient(HttpConnectionUtility.filter);

    断点到 :this.client.SendRequestAsync(requestMessage);

    一运行这一句,并且一直hold 住没运行其他代码,后台就已经收到两个请求了。是跟 filter 有关导致它会失败了自动重发一条吗?

    2014年9月1日 8:45

答案

  • 我们已经发现是那个API的问题了,需要把那个API的一个参数改一下就是只发一次了.

    HttpBaseProtocolFilter.allowUI = false;

    This value is true if HttpBaseProtocolFilter can prompt for user credentials when requested; otherwise false. The default value is true.

    2014年10月21日 9:12

全部回复

  • 你好 追寻阳光,

    听起来似乎是如果错误的请求信息,Windows Store App会用SendRequestAsync()发送两次,是这样吗?

    你能把filter中的内容告诉我么?我看到 HttpBaseProtocolFilter class 里面也有SendRequestAsync 这个方法,是否是因为你在哪里已经调用了这个方法?

    --James


    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    2014年9月2日 2:44
    版主
  • Hi,James.

    1。我的意思是我用SendRequestAsync() 发送请求,假设我请求失败了(后台返回失败),这个方法又会发另外一个请求出去。 相当于,我请求失败,它会立即重发一次请求。

    2。filter 中没有其他特别的内容,跟API的属性是一一对应, 它new 出来之后的参数如下:

    AllowautoRedirect : true

    AllowUI : true

    AutomaticDecompression : true

    CacheControl : {Windows.Web.Http.Filters.HttpCacheControl} 里面有 ReadBehavior : Default; WriteBehavior : Defualt

    ClientCertificate : null

    CookieManager : {Windows.Web.Http.HttpCookieManager}

    IgnorableServerCertificateErrors : Windows Runtion Object 里面有 Count : 0 ; IsReadOnly : false ; Results View ; Interface View; Dynamic View

    MaxConnectionsPerServer : 6

    ProxyCredential : null

    ServerCredential : null

    UseProxy : true

    3。我没有在其他地方调用HttpBaseProtocolFilter里面SendRequestAsync这个方法, 除非HttpClient.SendRequestAsync方法里有调用了它。因为我就断点到那句,那句一执行,我就没有运行下一个断点。

    2014年9月2日 4:24
  • 你好,

    我建议你可以使用一个三方的工具进行调试 Fiddler,因为你的Scenario略微有点复杂,我这里没有时间去重现,如果你可以提供一个可以运行的demo的话,我非常乐意帮你调试一下。

    置于Fiddler的话,你可以通过界面看到从本机出去了几次请求,包括请求的具体信息是什么。

    不过你第一个question里面提到: 一运行这一句,并且一直hold 住没运行其他代码,后台就已经收到两个请求了。

    我调试的Sample的时候的确发现会有添加 Header的时候运行 SendRequestAsync,不知道你项目中具体的情况是什么。

    --James


    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    2014年9月3日 13:20
    版主
  • 其实我们已经用Fiddler 调试过,很奇怪的是,成功就发出去一次;用户名密码失败或密码错误,就发出去两条。这就是关键问题,已经知道app会发两次,就是不知道哪里触发了重发请求。因为我们debug 到那里就不可以在到那个API里面打断点了。
    2014年9月15日 2:33
  • 我们尝试用另外一个API,HttpWebRequest.getResponseAsync, 成功就发出去一次;用户名密码失败或密码错误,也发出去一条。所以现在初步判断是那个API有重发功能。有谁可以确认一下?
    2014年9月22日 6:22
  • 我们已经发现是那个API的问题了,需要把那个API的一个参数改一下就是只发一次了.

    HttpBaseProtocolFilter.allowUI = false;

    This value is true if HttpBaseProtocolFilter can prompt for user credentials when requested; otherwise false. The default value is true.

    2014年10月21日 9:12