HttpWebRequest在mono和.net中的实现方式有所不同吗?

时间:2013-05-10 13:04:25

标签: c# mono stream httpwebrequest cloudinary

我正在尝试将c#cloudinary api移植到mono,我在构建http请求时遇到了一些问题。

我已经将这个方法分离出来设置请求,但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);
    }

2 个答案:

答案 0 :(得分:2)

当你这样做时

System.Net.HttpWebRequest.Create("http://foo.com");

您实际创建了内部类System.Net.Browser.BrowserHttpWebRequest

的实例

这是继承层次结构

System.Net.WebRequest
System.Net.HttpWebRequest
System.Net.Browser.PolicyBasedWebRequest
System.Net.Browser.BrowserHttpWebRequest

内容长度在PolicyBasedWebRequest中处理,在ctor中初始化为-1并且从未更改过; 我建议你手动设置它。

答案 1 :(得分:0)

见这里: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();

修复了问题。你可以试试这个。