在mono和.net中,HttpWebRequest的实现是否不同?

23
我正在尝试将C# Cloudinary API移植到Mono,并且在构建HTTP请求时遇到一些问题。我已经将此方法单独分离出来设置请求,但在Mono中 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);
    }

你正在运行哪个版本的Mono? - PhonicUK
我正在构建一个 MONO/.NET 4.0 库。最新的 Xamarin Studio。 - terjetyl
1
ContentLength不是Stream的属性,而是HttpWebRequest的属性。实现差异可能在于HttpWebRequest - I4V
为什么需要检查Request.ContentLength?因为ContentLength可能只有在请求开始时才被计算,所以我认为当调用GetResponse时。HTTP头可以设置,因此ContentLength可能仅在此阶段计算?如果您需要知道ContentLength,也许您可以首先手动计算它(例如使用Encoding.GetBytes)。 - Davide Icardi
@terjetyl,你好,你能解决它吗?我正在进行Mono-droid的移植工作。遇到的问题是相同的代码在桌面上运行正常,但在Xamarin中失败了。在VS中的测试通过了。 - Ankur
显示剩余3条评论
2个回答

2

0

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

使用这个:

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

问题已经修复。你可以尝试这个。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接