HttpWebRequest在mono和.net中的实现方式不同吗?
问题描述:
我正试图将c#cloudinary api移植到mono,并且我在构建http请求时遇到了一些问题。HttpWebRequest在mono和.net中的实现方式不同吗?
我已经分离出了设置请求的方法,但是HttpWebRequest.ContentLength原来是单声道的-1,但是.net的内容是正确构建的。
我在Mac上运行的是最新Xamarin Studio和我建立一个MONO/.NET 4.0库 单声道版本:2.10.12
编辑:简化代码,本次测试通过在Visual Studio,但失败Xamarin工作室
编辑:代码被推向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);
}
答
当你
System.Net.HttpWebRequest.Create("http://foo.com");
实际上创建内部类System.Net.Browser.BrowserHttpWebRequest
这里的一个实例是继承层次
System.Net.HttpWebRequest
System.Net.Browser.PolicyBasedWebRequest
System.Net.Browser.BrowserHttpWebRequest
内容长度在PolicyBasedWebRequest中处理,在ctor中用-1初始化并且永不改变; 我建议你手动设置它。
答
在这里看到: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();
解决了这一问题。你可以试试这个。
您使用的是哪种版本的Mono? – PhonicUK 2013-05-10 13:05:26
我正在构建一个MONO/.net 4.0库。最新Xamarin工作室 – terjetyl 2013-05-10 13:09:29
你可以检查你正在使用的单声道*确切*版本。你可以通过在命令行上运行“mono -version”来找到它。 – PhonicUK 2013-05-10 13:23:18