Skip to main content
 首页 » 编程设计

C# Silverlight WebClient 获取响应的内容类型

2024年01月13日29zlslch

有没有办法在 Silverlight 中使用 WebClient 获取响应的 Content-Type 或相反地设置传出请求的 Content-Type?

编辑

我需要发出 http 请求并能够显示它们的进度。我想将发出请求的机制打包成一个通用模块,并在我的代码中随处使用它。这个我已经做过了。困难似乎是在 POST 中向服务器提交不同类型的数据时,我无法告诉服务器数据是什么(json、xml、表单编码、二进制)

我相信我可以通过在请求中传递 ?content-type=x 并将服务器设置为优先于 Content-Type header 来解决这个问题。

我也没有办法知道服务器响应了什么样的内容,我想我可以通过在发出请求时传递预期的数据类型来解决这个问题。

如果谁有更好的解决方案,请说出来:)

/编辑

这是我的困境。 HttpWebRequest/Response 对象实现了一个允许监视请求进度的内部接口(interface)。如果您想执行大量请求,让用户看到显示下载/上传状态的进度条非常重要。

所以使用 HttpWebRequest/Response 已经过时了。只留下 WebClient,但我发现了一些奇怪的事情。

它不能被子类化。它实际上并没有被密封,但构造函数被标记为 [SecuritySafeCritical],据我所知,这意味着我不能从派生类调用它。至少我失败了,并且在谷歌上找到了其他失败的人,但我很高兴在这一点上被证明是错误的。

它在内部使用 BrowserHttpWebResponse,它不会覆盖抽象的 Headers 属性,而 WebClient.ResponseHeaders 只是转发到 m_Response.Headers,它只会抛出 NotImplementedException。

不确定 Content-Type 是否会在 ResponseHeaders 中,但我想检查一下。

在 Silverlight 中,我们似乎不得不选择进度信息或内容类型信息而不是两者。

根据文档,似乎也没有办法通过 WebClient 在传出请求上设置 Content-Type。 Content-Type 被列为受限 header 。不过我还没有实际测试过。

尽管值得注意的是,在发生错误时,您实际上会传递响应对象并可以访问 StatusCode、Content-Type 等。

请您参考如下方法:

一个更简单的解决方案可能是让客户端/服务器代码将上传/下载分成 block 并一次发送一个。然后你可以在每个 block 之后更新你的进度条。当然, block 越小,运行速度就越慢。

此外:您可以通过查询字符串参数告诉服务器它是什么内容类型?