使用多httpwebrequest来调用计时器中的webservice无法正常工作

时间:2014-04-30 21:40:10

标签: c# wpf json windows-phone-7 windows-phone-8

我在使用(Windows Phone App)

调用相同的URL时遇到问题
HttpWebRequest.Create(new Uri("http://x.x.x.x/webservice.svc/Getnewtick")) as HttpWebRequest

我在函数内部使用此请求,此函数在计时器上工作,我使用fiddler检查流量,我发现第一个请求工作但第二个不发送和新请求到服务器,你能告诉我(注意我已将消息框放在函数内部,并且它显示的时间意味着计时器工作正常)

根据您的要求,这是我的代码: -

private void FireRequest3(Object sender, EventArgs args)
{
    MessageBox.Show("hello");
    var request = HttpWebRequest.Create(new Uri("http://x.x.x.x/webservice.svc/Getnewtick")) as HttpWebRequest
    request.Method = "GET";
    request.CookieContainer = cookieJar;
    request.BeginGetResponse(ar =>
    {
        HttpWebRequest req2 = (HttpWebRequest)ar.AsyncState;
        using (var response = (HttpWebResponse)req2.EndGetResponse(ar))
        {
            using (Stream stream = response.GetResponseStream())
            {
                using (var reader = new StreamReader(stream))
                {
                    var outerRoot2 = JsonConvert.DeserializeObject<OuterRootObject2>(reader.ReadToEnd());
                    var root = JsonConvert.DeserializeObject<RootObject2>(outerRoot2.d);

                    DispatchInvoke(() =>
                    {
                        foreach (var Symbols1 in root.Symbols)
                        {
                            foreach (var nnn in DataReceivedCollection)
                            {
                                var symbolIDintold = Convert.ToInt16(nnn.symid);
                                var symbolIDintnew = Convert.ToInt16(Symbols1.I);
                                var BidStr = Convert.ToString(Symbols1.B);
                                var AskStr = Convert.ToString(Symbols1.B);

                                if (symbolIDintold == symbolIDintnew)
                                {
                                    nnn.textSecond = BidStr;
                                    nnn.textThird = AskStr;

                                }
                            }

                        }

                    });

                }
            }

        }

    }, request);
}

和计时器的开始按钮是: -

private void Button_Click_2(object sender, EventArgs e)
{
    DispatcherTimer newTimer = new DispatcherTimer();
    newTimer.Interval = TimeSpan.FromSeconds(3);
    newTimer.Tick += FireRequest3;
    newTimer.Start();

}

2 个答案:

答案 0 :(得分:1)

您可以从简化样品开始,例如:通过用var foo = reader.ReadToEnd();替换整个内部部分 - 如果这有帮助,那么您知道错误的下一步。

如果这没有帮助,那么尝试(更长)间隔。在我的一些应用程序中,我发现只有X的HttpWebRequest实例在任何给定时间都可以处于活动状态,X在1到8之间,可能与请求地址有关,也可能与请求地址无关。我最终得到了一个帮助类,它将所有请求(连同它们的响应)排入队列,因此在任何给定时间只存在一个HttpWebRequest。

答案 1 :(得分:0)

我已经解决了这个问题,我改变了这样的标题: -

HttpWebRequest.Create(new Uri("http://x.x.x.x/webservice.svc/Getnewtick")) as HttpWebRequest


if (request.Headers == null)
    {
        request.Headers = new WebHeaderCollection();
    }
    request.Headers[HttpRequestHeader.IfModifiedSince] = DateTime.UtcNow.ToString();