ASP.NET WebAPI无法发布

时间:2016-01-21 00:42:01

标签: f#

我无法将数据发布到ASP.NET WebAPI服务器。

我可以从WEBAPI服务器获取数据。但是,我无法发帖。

以下代码无法发布:

response = await client.PostAsync("api/Cars", content);

错误:

  

StatusCode:415,ReasonPhrase:'不支持的媒体类型',版本:1.1

客户端:

[TestClass]
public class UnitTest1
{
    // http://www.asp.net/web-api/overview/advanced/calling-a-web-api-from-a-net-client
    [TestMethod]
    public async Task TestMethod1()
    {
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri("http://localhost:48213/");
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            // HTTP GET
            var response = await client.GetAsync("api/Cars");
            if (response.IsSuccessStatusCode)
            {
                var result = await response.Content.ReadAsStringAsync();
            }

            // HTTP POST
            using (var content = new StringContent(@"some_value"))
            {
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                response = await client.PostAsync("api/Cars", content);

                if (response.IsSuccessStatusCode)
                {
                    Debug.WriteLine("Post was successful.");
                }
            }
        }

的WebAPI:

namespace FSharpWebAPI.Controllers

open System.Web.Http
open FSharpWebAPI.Models

type CarsController() =
    inherit ApiController()

    let values = [| { Make = "Ford"; Model = "Mustang" }; { Make = "Nissan"; Model = "Titan" } |]

    member x.Get() = values

    member x.Post(data) = 
        ignore

我只需做一个简单的帖子即可获得哪些更新?

1 个答案:

答案 0 :(得分:4)

正如@Fyodor Soikin指出的那样,Post方法是通用的('a -> 'b -> unit),并且ASP.NET Web API拒绝连接这些方法。

ASP.NET Web API使用约定优于配置,以便弄清楚如何路由和处理传入的请求。如果HTTP POST到达,它将寻找一个名为Post的方法(部分),并尝试调用它。虽然你可以说如果一个泛型方法可以处理输入,那么Web API仍然可以调用它,它不会这样做。

您需要添加类型注释 - 例如:

member x.Post(data : Car) = 
    ignore

这可能仍然不够,因为Post版本的类型是Car -> 'a -> unit,所以返回值是一个通用函数。如果Web API知道如何处理它,我会感到惊讶。

原因是ignore函数,并且由于Post没有调用函数,返回值是函数本身。

如果您想忽略输入并返回unit,您只需执行以下操作:

member x.Post(data : Car) = ()

此版本的类型为Car -> unit,我希望Web API可以接受。