将 C# 对象发送到 webapi 控制器

Posted

技术标签:

【中文标题】将 C# 对象发送到 webapi 控制器【英文标题】:Sending C# object to webapi controller 【发布时间】:2013-10-26 19:23:28 【问题描述】:

我正在尝试将 C# 对象传递给 Web api 控制器。该 api 被配置为存储发布给它的 Product 类型的对象。我已经使用 Jquery Ajax 方法成功添加了对象,现在我试图在 C# 中获得相同的结果。

我创建了一个简单的控制台应用程序来向 api 发送 Post 请求:

public class Product

    public int Id  get; set; 
    public string Name  get; set; 
    public string Category  get; set; 
    public decimal Price  get; set; 


         static void Main(string[] args)
    
        string apiUrl = @"http://localhost:3393/api/products";
        var client = new HttpClient();
        client.PostAsJsonAsync<Product>(apiUrl, new Product()  Id = 2, Name = "Jeans", Price = 200, Category =  "Clothing" );

    

postproduct方法永远不会被调用,如何将这个对象发送给控制器?

添加项目的方法:

    public HttpResponseMessage PostProduct([FromBody]Product item)
    
        item = repository.Add(item);
        var response = Request.CreateResponse<Product>(HttpStatusCode.Created, item);

        string uri = Url.Link("DefaultApi", new  id = item.Id );
        response.Headers.Location = new Uri(uri);
        return response;
    

【问题讨论】:

您的代码看起来不错,您在 fiddler 中看到了什么?您是否在服务器上启用了 webapi 跟踪? 我可以看到源自我正在使用的表单的请求,在 Fiddler 中没有可见 HttpClient 发送的请求。我还将 api 上传到:producttestapi.azurewebsites.net/api/products,但来自 HttpClient 的请求也没有到达该 api。 另外,检查那个 url 的 index.html,这是我用来通过 ajax 发送对象的形式,它可以工作,所以 api 没问题。 【参考方案1】:

看起来您以某种方式禁止接受 JSON 作为发布格式。我能够将数据发送到您的端点并使用application/x-www-form-urlencoded 创建新产品。这可能就是您的 jQuery 请求的执行方式。

你能展示你的 web api 的配置代码吗?您是否更改了默认格式化程序?

或者您可以从 HttpClient 发送表单。例如

    string apiUrl = "http://producttestapi.azurewebsites.net/api/products";
    var client = new HttpClient();
    var values = new Dictionary<string, string>()
        
            "Id", "6",
            "Name", "Skis",
            "Price", "100",
            "Category", "Sports"
        ;
    var content = new FormUrlEncodedContent(values);

    var response = await client.PostAsync(apiUrl, content);
    response.EnsureSuccessStatusCode();

【讨论】:

ajax 方法定义了 'dataType: "json"'。所以这让我认为控制器仍然接受 JSON 作为数据。我添加了处理将新对象添加到列表的方法。我会显示配置代码,它是 App_Start 文件夹中的 .cs 文件吗?同时,打算试试你在这里发布的方法。 我还可以使用您提供的代码使用 PostAsJson 方法,现在它可以工作了。非常感谢您,先生! 如果类中有字符串数组这样的参数,我们可以做什么。我无法将其设置为 Dictionary 因为 FormUrlEncodedContent 不接受 Dictionary

以上是关于将 C# 对象发送到 webapi 控制器的主要内容,如果未能解决你的问题,请参考以下文章

将数组json发送到控制器web api c#

C# WebApi 通过 body 从 C# MVC 接收 json

如何从不带引号的 WebAPI 控制器发送带有 javascript 函数的 JSON

将base64字符串发送到c#服务器

将多个对象从Angular控制器POST到Web API 2

C# WebApi 等待 WebHook 响应