HttpWebRequest 在 mono 和 .net 中的实现方式是不是不同?

Posted

技术标签:

【中文标题】HttpWebRequest 在 mono 和 .net 中的实现方式是不是不同?【英文标题】:Is HttpWebRequest implemented differently in mono and .net?HttpWebRequest 在 mono 和 .net 中的实现方式是否不同? 【发布时间】:2013-05-05 04:18:03 【问题描述】:

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

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

我正在 Mac 上运行最新的 Xamarin Studio,并且正在构建 MONO / .NET 4.0 库 单声道版本: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? 我正在构建一个 MONO/.net 4.0 库。最新 Xamarin 工作室 你能检查一下你正在使用的 Mono 的 exact 版本吗?您可以通过在命令行上运行“mono -version”来查找。 Mono JIT 编译器版本 2.10.12(mono-2-10/c9b270d Thu Mar 7 21:38:12 EST 2013) ContentLength 不是 Stream 的属性,而是 HttpWebRequest 的属性。实现差异可能在 HttpWebRequest. 【参考方案1】:

当你这样做时

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

你实际上创建了一个内部类System.Net.Browser.BrowserHttpWebRequest的实例

这是继承层次结构

System.Net.WebRequestSystem.Net.HttpWebRequestSystem.Net.Browser.PolicyBasedWebRequestSystem.Net.Browser.BrowserHttpWebRequest

内容长度在 PolicyBasedWebRequest 中处理,在 ctor 中初始化为 -1 并且永不改变; 建议你手动设置。

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于HttpWebRequest 在 mono 和 .net 中的实现方式是不是不同?的主要内容,如果未能解决你的问题,请参考以下文章

Linux中用HttpWebRequest或WebClient访问远程https路径

HttpWebRequest的Timeout和ReadWriteTimeout

页面重定向时 HttpWebRequest 和 Restsharp 不返回响应

webrequest 和 httpwebrequest 有啥区别

HttpRequest 和HttpWebRequest的区别

避免 HttpWebRequest GET 和 ProtocolViolationException