如何从 URL 传递变量作为 ASP.NET Web API 操作方法的参数?

How to pass a variable from URI as argument for ASP.NET WebAPI action method?

我以前有这个工作,现在我没有。但是,我看不出我做了什么让它不起作用?

这是我的 MVC API 控制器:

[HttpPost]
public Models.CustomerAddress Add(string Customer)
{
    //the customer is a json string
}

这是我的 C# 桌面客户端:

using (var client = new HttpClient())
{
    client.BaseAddress = new Uri(Shared.URL);
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(Shared.HeaderType));
    string jsonInput = JsonConvert.SerializeObject(customer);
    HttpContent contentPost = new StringContent(jsonInput, Encoding.UTF8, "application/json");
   var response = client.PostAsync(string.Format("http://myuri/api/Customer/Add?Customer="), contentPost).Result;
    response.EnsureSuccessStatusCode();
    string json = await response.Content.ReadAsStringAsync();
    return JsonConvert.DeserializeObject<Model.CustomerAddress>(json);
}

肯定填充了客户对象...

这确实调用了我的 api 但 Customer 字符串为空??

使用[FromUri]

要强制 Web API 从 URI 中读取复杂类型,请将 [FromUri] 属性添加到参数中。以下示例定义了一个 GeoPoint 类型,以及一个从 URI 获取 GeoPoint 的控制器方法。

public class GeoPoint
{
    public double Latitude { get; set; } 
    public double Longitude { get; set; }
}

public ValuesController : ApiController
{
    public HttpResponseMessage Post([FromUri] GeoPoint location) { ... }
}

客户端可以将纬度和经度值放入查询字符串中,Web API 将使用它们构建 GeoPoint。例如:

http://localhost/api/values/?Latitude=47.678558&Longitude=-122.130989

ASP.NET 网页API: Details and examples

肯定是客户端和服务器不匹配。您的 URI 指定了一个名称为 Customer 的参数,该名称与方法的参数匹配,但您没有为该参数提供任何值。 = 符号后没有任何内容。

您在客户端代码中传递序列化对象的方式实际上是作为请求的主体到达服务器。为了将其作为方法中的参数,您实际上应该使用 [FromBody] 属性并从 URL.

中删除 &Customer= 部分
[HttpPost]
public Models.CustomerAddress Add([FromBody]string Customer)
{
    //the customer is a json string
}

这就是客户:

using (var client = new HttpClient())
{
    client.BaseAddress = new Uri(Shared.URL);
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(Shared.HeaderType));
    string jsonInput = JsonConvert.SerializeObject(customer);
    HttpContent contentPost = new StringContent(jsonInput, Encoding.UTF8, "application/json");
   var response = client.PostAsync("http://myuri/api/Customer/Add", contentPost).Result;
    response.EnsureSuccessStatusCode();
    string json = await response.Content.ReadAsStringAsync();
    return JsonConvert.DeserializeObject<Model.CustomerAddress>(json);
}

这是将数据传递到 Post 方法的更好方法,因为您不需要对其进行编码以满足 URI 格式的要求。在请求正文中发送数据也可以容纳更大的负载。

您只需将控制器更改为:

[HttpPost]
public Models.CustomerAddress Add(Customer customer)
{
    // customer gets instantiated by the model binder
}

客户端现在可以post这样的请求:

    var jsonCustomer = JsonConvert.SerializeObject(customer);
    var contentPost = new StringContent(jsonCustomer, Encoding.UTF8, "application/json");
    var response = client.PostAsync("http://myuri/api/Customer/Add", contentPost).Result;