gpt4 book ai didi

c# - 如何在 Windows Phone/Store 应用程序中接受 "unsafe"HTTP 响应 header ?

转载 作者:行者123 更新时间:2023-11-30 18:28:20 25 4
gpt4 key购买 nike

最近,Windows Phone 8.1 Silverlight 应用程序中使用 HttpClient 访问第 3 方 REST API 的部分代码停止工作。我收到以下错误:

A first chance exception of type 'System.Exception' occurred in mscorlib.ni.dll

Additional information: Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))

在 Windows Phone (Silverlight) 和 Store (RT) 应用程序中尝试此操作后,我在 WPF 中重写了相同的代码,最后得到了一条有用的错误消息:

The server committed a protocol violation. Section=ResponseHeader Detail=CR must be followed by LF"

还有一个great in-depth blog post关于这个问题。

Microsoft 已声明他们 will not fix/allow this所以我要么被迫找到一个允许不安全 header 的第 3 方 HTTP 库,要么自己编写。

我该如何解决这个问题?如果我从头开始编写自己的库,应该考虑哪些合适的类?有相关的示例代码吗?

(这个问题可能与 this one 太相似了,虽然在编写了一些测试代码之后,使用自定义处理程序和 HttpClient 的想法也不起作用,因为 system handler is called first 响应。 )

最佳答案

事实证明,您可以相当轻松地实现基本的 HTTP 客户端。忽略错误处理和处理 Content-Length(稍后会详细介绍),这段代码应该可以解决问题。

var hostname = new HostName("www.w3.org");
var socket = new StreamSocket();
await socket.ConnectAsync(hostname, "80");

var request = "GET /Protocols/rfc2616/rfc2616-sec4.html HTTP/1.1\r\n" +
"Host: www.w3.org\r\n" +
"\r\n";

var writer = new DataWriter(socket.OutputStream);
writer.WriteString(request);
await writer.StoreAsync();

var reader = new DataReader(socket.InputStream);
reader.InputStreamOptions = InputStreamOptions.Partial;

string data = string.Empty;
var cts = new CancellationTokenSource();

bool doneReading = false;
uint bytesToRead = 10240;

while (!doneReading)
{
try
{
cts.CancelAfter(10 * 1000);
await reader.LoadAsync(bytesToRead).AsTask(cts.Token);
data += reader.ReadString(reader.UnconsumedBufferLength);

totalBytesRead += bytesRead;
}
catch (TaskCanceledException)
{
doneReading = true;
}
}

socket.Dispose();

肯定有一些问题需要解决:

  • 超时时间为 10 秒。但取决于您所使用的连接类型,也许这没问题?
  • 就此而言,等待超时是确定服务器是否已完成发送数据的错误方法。正如 Jon Skeet 在 Correctly receiving data using StreamSocket hangs 中提到的那样,客户端应从 header 中读取 Content-Length 并请求适当的字节数。当然,因为 TCP is a stream这也需要一些工作。

此外,此解决方案主要针对 Windows Phone 8.1 Silverlight。尽管它也适用于 Windows Phone 8.1/Windows Store(即 WinRT)应用程序,但在该平台上使用 MessageWebSocket 可能更容易。

我就此写了一个由三部分组成的系列文章,因为它似乎是一个相当普遍的问题; part two 中讨论了此解决方法.还需要注意的是,错误消息 CR must be followed by LF may not be completely accurate -- 这也可能意味着 header 中存在无效字符(包括其中一个 header 名称中的空格)。

关于c# - 如何在 Windows Phone/Store 应用程序中接受 "unsafe"HTTP 响应 header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25209693/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com