【问题标题】:WebException with ContentType Multipart/form-data带有 ContentType Multipart/form-data 的 WebException
【发布时间】:2016-04-22 23:23:20
【问题描述】:

我正在尝试进行 httpwebrequest,以连接客户的 api。这适用于大多数 api,但其中一个需要 ContentType = "multipart/form-data",这就是为什么我必须将它添加到我的请求中。但是自从我添加它后,我在使用 GetResponse 方法的那一行得到了一个 System.Net.WebException。我的 JsonRequest 是正确的,因为我在演示站点上尝试过,但我不知道如何处理这个异常!如果我不在 ContentType multipart/form-data 中,我会从 api 收到一条错误消息,即“并非所有参数都设置正确”。 我希望你能帮助我!

 var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
        httpWebRequest.ContentType = "text/json";
        httpWebRequest.Method = requestMethode;
        httpWebRequest.Accept = "application/json";
            httpWebRequest.ContentType = "multipart/form-data";
        using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
        {
            streamWriter.Write(json);
            streamWriter.Flush();
            streamWriter.Close();
        }
        string strResponse = "";
        try
        {
            using (WebResponse httpResponse = httpWebRequest.GetResponse()) // error here
            {
                using (Stream responseStream = httpResponse.GetResponseStream())
                {
                    using (StreamReader streamReader = new StreamReader(responseStream))
                    {
                        strResponse = streamReader.ReadToEnd();
                    }
                }
            }
        }
        catch (WebException exception)
        {
            throw exception;
        }
        JObject jobject = JObject.Parse(strResponse);
        return jobject;
    }

非常感谢!

【问题讨论】:

  • 您收到的异常消息是什么?
  • 如果您指定multipart/form-data Content-Type,为什么要向服务器发送一些JSON 有效负载?这些是非常不同的事情。
  • @Darin,因为 api 不需要文件请求,这就是为什么我要另辟蹊径。但不幸的是,无论如何我都必须设置内容类型。
  • @Yacoub 这是一个 500 内部服务器错误

标签: c# json httpwebrequest multipartform-data


【解决方案1】:

您尝试调用的远程端点似乎需要multipart/form-data 编码请求。我强烈建议您阅读corresponding specification,以更好地熟悉需要通过网络发送的确切有效负载。这样,您将更好地了解代码的问题所在。

一旦您阅读了规范,您可能会想出以下内容:

string json = "PUT THE SAMPLE JSON TAKEN FROM HERE https://i.materialise.com/api/docs/cart-item-creation-api/";
var url = "https://imatsandbox.materialise.net/web-api/cartitems/register";
var request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
var boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x", NumberFormatInfo.InvariantInfo);
request.ContentType = "multipart/form-data; boundary=" + boundary;
boundary = "--" + boundary;

using (var stream = request.GetRequestStream())
using (var writer = new StreamWriter(stream))
{
    writer.WriteLine(boundary);
    writer.WriteLine("Content-Disposition: form-data; name=\"data\"; filename=\"blob\"");
    writer.WriteLine("Content-Type: application/json");
    writer.WriteLine();
    writer.Write(json);
    writer.WriteLine();
    writer.WriteLine(boundary + "--");
}

using (var response = request.GetResponse())
using (var stream = response.GetResponseStream())
using (var reader = new StreamReader(stream))
{
    string strResponse = reader.ReadToEnd();
    return JObject.Parse(strResponse);
}

另外请注意,我已经删除了您只是重新抛出的无意义的try/catch

【讨论】:

  • 哇,非常感谢!有用。下次我会尝试理解这个理论!
  • 不,下次不会。你最好现在就理解这个理论。就我个人而言,我会非常害怕运行我不明白它如何/为什么工作的代码。如果我是你,我永远不会相信互联网上的任何人为我提供一些代码 sn-ps 并将它们放入我的生产代码中,而无需了解此代码的基础知识。某些代码有效这一事实并不意味着该代码是最佳的,或者您应该在生产中使用它。
  • 当然不是。它只是在沙盒上,我会在沙盒上理解它,然后再开始制作。再次感谢您
猜你喜欢
  • 2013-10-21
  • 2019-06-10
  • 2019-11-09
  • 2021-08-30
  • 1970-01-01
  • 2020-02-11
  • 2020-05-30
  • 2015-03-04
  • 1970-01-01
相关资源
最近更新 更多