代码之家  ›  专栏  ›  技术社区  ›  B. Clay Shannon-B. Crow Raven

为什么我的WebAPI服务器的HttpWebRequest POST方法失败了?

  •  3
  • B. Clay Shannon-B. Crow Raven  · 技术社区  · 12 年前

    我已经成功地从我的WebAPI项目(“GET”)中接收到数据,但我发布的尝试不起作用。以下是相关的服务器/WebAPI代码:

    public Department Add(Department item)
    {
        if (item == null)
        {
            throw new ArgumentNullException("item");
        }
        departments.Add(item);
        return item; 
    }
    

    …当从客户端调用此代码时,在“departments.Add(item);”行失败:

    const string uri = "http://localhost:48614/api/departments";
    var dept = new Department();
    dept.Id = 8;
    dept.AccountId = "99";
    dept.DeptName = "Something exceedingly funky";
    
    var webRequest = (HttpWebRequest)WebRequest.Create(uri);
    webRequest.Method = "POST";
    var deptSerialized = JsonConvert.SerializeObject(dept); // <-- This is JSON.NET; it works (deptSerialized has the JSONized versiono of the Department object created above)
    using (StreamWriter sw = new StreamWriter(webRequest.GetRequestStream()))
    {
        sw.Write(deptSerialized);
    }
    HttpWebResponse httpWebResponse = webRequest.GetResponse() as HttpWebResponse;
    using (StreamReader sr = new StreamReader(httpWebResponse.GetResponseStream()))
    {
        if (httpWebResponse.StatusCode != HttpStatusCode.OK)
        {
            string message = String.Format("POST failed. Received HTTP {0}", httpWebResponse.StatusCode);
            throw new ApplicationException(message);
        }  
        MessageBox.Show(sr.ReadToEnd());
    }
    

    …在“HttpWebResponse HttpWebResponse=webRequest.GetResponse()as HttpWebResponse;”行失败。

    服务器上的错误消息是departments为null;deptSerialized正在填充JSON“记录”,所以…这里缺少什么?

    更新

    指定ContentType确实解决了这个难题。此外,StatusCode是“Created”,这使得上面的代码抛出了一个异常,所以我将其更改为:

    using (StreamReader sr = new StreamReader(httpWebResponse.GetResponseStream()))
    {
        MessageBox.Show(String.Format("StatusCode == {0}", httpWebResponse.StatusCode));
        MessageBox.Show(sr.ReadToEnd());
    }
    

    …显示“StatusCode==Created”,后面是我创建的JSON“record”(数组成员?term.?)。

    1 回复  |  直到 12 年前
        1
  •  3
  •   Darin Dimitrov    12 年前

    你忘了设置正确的 Content-Type 请求标头:

    webRequest.ContentType = "application/json";
    

    您在POST请求的主体中编写了一些JSON负载,但您如何期望Web API服务器知道您发送的是JSON负载,而不是XML或其他内容?您需要为此设置适当的Content-Type请求标头。

    推荐文章