HttpWebRequest 在 mono 和 .net 中的实现方式是不是不同?
Posted
技术标签:
【中文标题】HttpWebRequest 在 mono 和 .net 中的实现方式是不是不同?【英文标题】:Is HttpWebRequest implemented differently in mono and .net?HttpWebRequest 在 mono 和 .net 中的实现方式是否不同? 【发布时间】:2013-05-05 04:18:03 【问题描述】:我正在尝试将 c# cloudinary api 移植到 mono,但在构建 http 请求时遇到了一些问题。
我已经分离出这种设置请求的方法,但是 HttpWebRequest.ContentLength 在单声道中结果是 -1,但是 .net 内容是正确构建的。
我正在 Mac 上运行最新的 Xamarin Studio,并且正在构建 MONO / .NET 4.0 库 单声道版本:2.10.12
编辑:简化代码,此测试在 Visual Studio 中通过,但在 Xamarin Studio 中失败
编辑:如果有人愿意帮助,代码被推送到github
[Test]
public void StreamTest()
var request = System.Net.HttpWebRequest.Create("http://foo.com");
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
using (var writer = new System.IO.StreamWriter(request.GetRequestStream()))
writer.Write("anything");
Assert.IsTrue(request.ContentLength > 0);
【问题讨论】:
你运行的是什么版本的 Mono? 我正在构建一个 MONO/.net 4.0 库。最新 Xamarin 工作室 你能检查一下你正在使用的 Mono 的 exact 版本吗?您可以通过在命令行上运行“mono -version”来查找。 Mono JIT 编译器版本 2.10.12(mono-2-10/c9b270d Thu Mar 7 21:38:12 EST 2013)ContentLength
不是 Stream 的属性,而是 HttpWebRequest 的属性。实现差异可能在 HttpWebRequest.
【参考方案1】:
当你这样做时
System.Net.HttpWebRequest.Create("http://foo.com");
你实际上创建了一个内部类System.Net.Browser.BrowserHttpWebRequest的实例
这是继承层次结构
System.Net.WebRequestSystem.Net.HttpWebRequestSystem.Net.Browser.PolicyBasedWebRequestSystem.Net.Browser.BrowserHttpWebRequest
内容长度在 PolicyBasedWebRequest 中处理,在 ctor 中初始化为 -1 并且永不改变; 建议你手动设置。
【讨论】:
【参考方案2】:请看这里:Xamarin Forum
它建议替换这个:
byte[] buffer = Encoding.GetEncoding("UTF-8").GetBytes(bundleString);
string result = Convert.ToBase64String(buffer);
StreamWriter requestWriter = new StreamWriter(httpWebRequest.GetRequestStream());
requestWriter.Write(result, 0, result.Length);
requestWriter.Flush();
requestWriter.Close();
用这个:
httpWebRequest.ContentLength = bundleString.Length;
StreamWriter requestWriter = new StreamWriter(httpWebRequest.GetRequestStream());
requestWriter.Write(bundleString);
requestWriter.Flush();
requestWriter.Close();
解决了这个问题。你可以试试这个。
【讨论】:
以上是关于HttpWebRequest 在 mono 和 .net 中的实现方式是不是不同?的主要内容,如果未能解决你的问题,请参考以下文章
Linux中用HttpWebRequest或WebClient访问远程https路径
HttpWebRequest的Timeout和ReadWriteTimeout
页面重定向时 HttpWebRequest 和 Restsharp 不返回响应
webrequest 和 httpwebrequest 有啥区别