HttpWebRequest在mono和.net中实现不同吗?

本文关键字:实现 mono net HttpWebRequest | 更新日期: 2023-09-27 18:13:12

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

我已经分离出这个方法来设置请求,但HttpWebRequest。ContentLength在单声道中是-1,但在。net中内容是正确构建的。

我在Mac上运行最新的Xamarin Studio,我正在构建一个MONO/.NET 4.0库Mono版本: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);
    }

HttpWebRequest在mono和.net中实现不同吗?

当你这么做的时候

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中处理,初始化为-1并且永远不会改变;我建议您手动设置。

查看这里:Xamarin论坛

它建议替换这个:

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

with this:

httpWebRequest.ContentLength = bundleString.Length;
StreamWriter requestWriter = new StreamWriter(httpWebRequest.GetRequestStream());
requestWriter.Write(bundleString);
requestWriter.Flush();
requestWriter.Close();

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