23

我正在尝试将 c# cloudinary api 移植到单声道,但在构建 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);
    }
4

2 回答 2

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 并且永不改变;建议你手动设置。

于 2013-05-23T15:36:04.660 回答
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();

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

于 2015-05-26T07:00:59.490 回答