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); 
    } 
+0

您使用的是哪种版本的Mono? – PhonicUK 2013-05-10 13:05:26

+0

我正在构建一个MONO/.net 4.0库。最新Xamarin工作室 – terjetyl 2013-05-10 13:09:29

+0

你可以检查你正在使用的单声道*确切*版本。你可以通过在命令行上运行“mono -version”来找到它。 – PhonicUK 2013-05-10 13:23:18

当你

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(); 

解决了这一问题。你可以试试这个。