【问题标题】:Passed Variables Null传递的变量 Null
【发布时间】:2016-01-15 21:18:34
【问题描述】:

我正在构建一个用于同步数据和下拉对象的小型 Web API,效果很好,但是无论我尝试什么,都无法将我的对象向上推。

已编辑以反映一些变化:

这是我的控制器:

[System.Web.Mvc.HttpPost]
    public void UpdateTasks([FromBody] string s)
    {
        Console.WriteLine(s);
    }

这是我的客户端代码:

HttpContent c = new StringContent("1234");
        HttpClient client = new HttpClient();
        c.Headers.ContentType = new MediaTypeHeaderValue("application/json");
        client.BaseAddress = new Uri("http://localhost/QAQC_SyncWebService/Tasks/UpdateTasks/");
        var resp = client.PostAsync(client.BaseAddress, c).Result;

如果我把它放在 URI 中,我可以得到一个值,但是单独的字符串内容似乎不起作用。

【问题讨论】:

  • 设置Content-Type:application/json,字符串前也使用[FromBody]
  • 我做了:c.Headers.ContentType = new MediaTypeHeaderValue("application/json");它仍然是空的。
  • 很可能您的 PUT 请求被网络服务器阻止。看看这个线程之一:stackoverflow.com/questions/10906411/…stackoverflow.com/questions/28579073/…
  • 就像脏检查一样,你为什么不尝试使用完整的 URL:"http://localhost/QAQC_SyncWebService/Tasks/1234"
  • @MarkC。我使用完整的 url 并且只有当我将其更改为 Post 操作时才有效。

标签: c# asp.net-web-api dotnet-httpclient


【解决方案1】:

试试

[HttpPut]
public void UpdateTasks([FromBody]string s)
{
    Console.WriteLine(s);
}

另请注意:

  1. [FromBody] 参数必须编码为 =value 最后一个障碍是 Web API 要求您以特定格式传递 [FromBody] 参数。这就是为什么在前面的例子中我们的 value 参数是 null 的原因,即使我们用 [FromBody] 修饰了方法的参数。 与大多数客户端和服务器端框架所期望的相当标准的 key=value 编码不同,Web API 的模型绑定器期望在 POST 正文中找到根本没有键名的 [FromBody] 值。换句话说,它不是在寻找 key=value,而是在寻找 =value。 到目前为止,这部分是将原始类型发送到 Web API POST 方法中最令人困惑的部分。理解后还不错,但非常不直观且不易被发现。

来自http://encosia.com/using-jquery-to-post-frombody-parameters-to-web-api/

【讨论】:

    【解决方案2】:

    您正在初始化 client.BaseAddress 的行看起来有点不对劲。

    HttpContent c = new StringContent("1234");
    HttpClient client = new HttpClient();
    c.Headers.ContentType = new MediaTypeHeaderValue("application/json");
    client.BaseAddress = new Uri("http://localhost/QAQC_SyncWebService/Tasks/UpdateTasks");
    var resp = client.PutAsync(client.BaseAddress, c).Result;
    

    PutAsync 方法需要完整的 URI,而不仅仅是一个方法。在这里阅读更多:https://msdn.microsoft.com/en-us/library/hh138168(v=vs.118).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1

    【讨论】:

    • 它确实没有改变任何东西,它仍然在控制器中进行调试,但参数为空。参数需要命名吗?
    猜你喜欢
    • 2017-01-16
    • 2012-11-22
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多