【问题标题】:System.Net.WebException : The remote server returned an error: (415) UNSUPPORTED MEDIA TYPESystem.Net.WebException :远程服务器返回错误:(415)不支持的媒体类型
【发布时间】:2013-05-27 11:43:38
【问题描述】:

我在访问安静的 Web 服务时遇到了一些代码问题。 运行此代码,它在 var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); 处出错并且返回的异常是:“System.Net.WebException:远程服务器返回错误:(415)不支持的媒体类型。”

    public bool CreateAccount(string myUsername, string url, string authtoken) {
        try {
            HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
            httpWebRequest.ContentType = "application/json";
            httpWebRequest.MediaType="application/json";
            httpWebRequest.Accept="application/json";
            httpWebRequest.Method = "POST";

            WebHeaderCollection headers = new WebHeaderCollection();
            headers.Add("Authorization: Token"+authtoken);
            httpWebRequest.Headers = headers;

            using (StreamWriter streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) {
                streamWriter.Write("{username : '"+myUsername+"'}");
            }

            var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); // Fails on this line.
            using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) {
                JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
                string json = streamReader.ReadToEnd();
            }
            return true;

        } catch (WebException e) {
            throw e;
            return false;
        }
        //return true;
    }

我已经为 ContentType、MediaType 和 Accept 尝试了各种方法,但服务开发人员给我的工作示例提供 -H "Content-Type: application/json" to curl,所以看起来“应用程序/json”是正确的值。他也做 --data-binary,我假设 streamWriter 为我做。

有谁知道是什么导致了这个错误?

【问题讨论】:

    标签: c# json rest


    【解决方案1】:

    想通了。

    当我这样做时:

            WebHeaderCollection headers = new WebHeaderCollection();
            headers.Add("Authorization: Token "+authtoken);
            httpWebRequest.Headers = headers;
    

    我不小心吹走了所有通过以下操作创建的现有标头:

            httpWebRequest.ContentType = "application/json";
            httpWebRequest.MediaType="application/json";
            httpWebRequest.Accept="application/json";
            httpWebRequest.Method = "POST";
    

    答案是将我创建带有身份验证令牌的标头的代码移到我设置其他标头的代码上方。

    【讨论】:

      【解决方案2】:

      此错误的一个已知原因是服务文件和配置文件中的服务名称不匹配。那就是你的服务名和配置服务名不匹配”

      在解决方案资源管理器中右键单击 .svc 文件并选择“查看标记”并将正确的服务名称粘贴到 .config 中。

      【讨论】:

      • 同样在上述步骤之前,看看能不能直接浏览服务很重要。
      • 我没有服务文件。如果您使用的是 RESTful 服务,我认为您不需要一个。
      • 您使用什么工具查看服务?我建议使用 HTTP4E 客户端或 RESTClient。
      • 再次重要的是看看您是否可以在 C# 之外访问该服务。
      • 就像我已经说过的,开发人员为我提供了一个可以成功访问服务的有效 curl 调用。这不是服务,而是我的代码。
      猜你喜欢
      • 2014-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-13
      • 2018-07-25
      • 2016-09-09
      • 2017-08-22
      • 1970-01-01
      相关资源
      最近更新 更多