1

我想之前其完整的去响应流的引用在Windows Phone的8内容流之前读取HTTP流的内容是完整的Windows Phone 8

在其他.NET平台上,你可以做

HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(myUri); 
WebResponse subscribeWebResponse = null; 
Stream subscribeStream = null; 

subscribeWebResponse = httpRequest.GetResponse(); 
subscribeStream = subscribeWebResponse.GetResponseStream(); 

为了创建可移植类库,我使用了nuget的HttpClientLibrary。

这增加了裁判的扩展组件Microsoft.Net.Http

这使我回到当时的异步请求的头已经被阅读的,而不是等待内容传输是完整的

var clientResponse = await httpClient.SendAsync(requestmessage, HttpCompletionOption.ResponseHeadersRead); 

我遇到的问题是,在Windows Phone 8中它不能正常工作,并仍然等待内容流返回的完成。

此外

await httpWebRequest.BeginGetResponse(callback, request) 

具有相同的行为,因为这些异步方法实际上是在等待网页的响应,继续执行完毕。

那么,有没有什么办法来实现返回的响应/流在我已经收到没有Microsoft.Http.Net包的响应头? 即使它必须是Windows Phone 8平台特定解决方案? 可能是HttpWebRequest的扩展?

+0

你可以使用'WebRequest.GetResponseAsync'像[这里](HTTP://堆栈溢出。com/a/19215782/1768303),然后'WebResponse.GetResponseStream',然后'Stream.ReadAsync'。 – Noseratio

+0

我已经看到堆栈溢出的文章。它不是为Windows Phone 8编写的,因为Windows Phone 8中不存在用于HttpWebRequest类的GetResponseAsync方法。 –

+0

@ZackWeiner你在做什么是正确的做法。你确定它不工作?你的回应机构有多大?你怎么知道它仍在等待“完成内容流”? –

回答

0

所以这里是交易。由于平台限制,我想说你想做的事情是不可能的......但是SignalR有一个WP客户端并且能够管理它。所以在我看来,你有两种选择:

1)挖掘到SignalR源代码,看看他们是如何做到的(我现在在我的手机上,所以我不能提供链接)。

更新:Here is the link。他们做一些漂亮的技巧,比如将Timeout设置为-1以适应长时间运行的客户端。我认为你应该使用这里的技术。

OR

2)您可以将你在做什么到SignalR,其将获得具有强大的基础设施,并为跨平台兼容的好处。

HTH

+0

虽然我不熟悉SignalR,但看起来好像SignalR是后端服务和客户端。 I.E.你需要一个服务器端组件。我已经有了服务器端的实现,并且它在其他平台上运行良好......我可能只需要将其吸收并通过套接字进行监听。 –

+0

Zack,我只是用链接更新了我的评论。你应该看看SignalR的来源,我相信他们使用的技术一定会解决你的问题。 – AdvancedREI

+0

HttpClient也在封面下使用超时-1技巧。在HttpWebRequest中设置超时只能在执行同步请求时正常工作。 –

1

从我可以告诉,ResponseHeadersRead工程作为它在桌面上的WP8模拟器。

我安装了Win8 SDK。创建了一个Windows Phone应用程序。我将此代码添加到MainPage ctor。这表明了一个非常基本的长投票例子。

 var client = new HttpClient(); 

     var request = new HttpRequestMessage() 
     { 
      RequestUri = new Uri("http://oak:1001/longpolling") 
     }; 
     client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, new CancellationToken()) 
      .ContinueWith((t) => 
      { 
       var response = t.Result; 
       response.Content.ReadAsStreamAsync() 
        .ContinueWith(s => 
        { 
         var st = s.Result; 
         while (true) 
         { 
          var message= ReadNextMessage(st); 
         } 
        });  
      }); 
    } 
    private static string ReadNextMessage(Stream stream) 
     { 
      int chr = 0; 
      string output = ""; 
      while (chr != 10) 
      { 
       chr = stream.ReadByte(); 
       output += Convert.ToChar(chr); 
      } 
      return output; 
    } 

在我的主机开发机我有一个控制器,它看起来像这样一个网页API ...

public class LongPollingController : ApiController 
    { 
     public HttpResponseMessage Get() 

     { 
      Thread.Sleep(2000); 
      var content = new PushStreamContent((s,c,t) => 
      { 
       int i = 0; 
       while (true) 
       { 
        try 
        { 
         var message = String.Format("The current count is {0} " + Environment.NewLine, i++); 
         var buffer = Encoding.UTF8.GetBytes(message); 
         s.Write(buffer, 0, buffer.Length); 
        } 
        catch (IOException exception) 
        { 
         s.Close(); 
         return; 
        } 
        Thread.Sleep(1000); 
       } 
      }); 
      return new HttpResponseMessage(HttpStatusCode.OK) 
      { 
       RequestMessage = Request, 
       Content = content 
      }; 
     } 
    } 
+0

你真的能够读取流?我将这段代码弹出到一个示例应用程序中,并将其修改为连接到我的实时SSE服务器,并且我可以看到执行继续超越了SendAsync,因为我在下一行执行时有一个简单的字符串值赋值......但Continuation1似乎只在发生错误的情况下执行,而不是在建立连接并将数据发送到管道时执行......因此,Continuation2和ReadNextMessage()永远不会触发。我可以使用Fiddler的CommetPeek函数(右键单击打开的连接)验证数据是否正在连接。 –

+0

我能够读取流很好。然而,这只是在模拟器中。我还没有手机开发者帐户设置,因此我无法在真实硬件上进行测试。 –

+0

即时通讯也使用模拟器,但本地主机WebApi有问题,所以我创建了一个新的WebApi项目,将你的代码放在get方法中并将其发布到真正的交易万维网上。路由是http://www.thepartypedro.com/api/values,代码与您提供的api控制器相同,您是否可以确认可以读取该终端?如果是这样,我们可以确认您也使用Microsoft.Net.Http build 2.2.18?你也可以确认没有长时间运行的获得端点@ http://thepartypedro.com/api/values/13 –