Web API Post 返回 415 - 不支持的媒体类型

Posted

技术标签:

【中文标题】Web API Post 返回 415 - 不支持的媒体类型【英文标题】:Web API Post returns 415 - Unsupported Media Type 【发布时间】:2016-11-26 14:18:42 【问题描述】:

应该如何使用 C# 对 SQL Server 数据库执行 CRUD 操作?

例如,假设有一个 DB 表 Employees 包含这些列:

EmployeeID, FirstName, PostalCode

我希望向该数据库发布一个新员工的信息。什么是实现这一目标的有效方法?

我现在的HttpPost

namespace API.Controllers

    public class EmployeesController : ApiController
    
        [HttpPost]
        public void AddEmployee (Employee employee)
        
            SqlConnection myConnection = new SqlConnection();
            myConnection.ConnectionString = @"Server=.\servername;Database=Northwind;User ID=Username;Password=password;";

            SqlCommand sqlCmd = new SqlCommand();
            sqlCmd.CommandType = CommandType.Text;
            sqlCmd.CommandText = "INSERT INTO Employee (EmployeeID,FirstName,PostalCode) Values (@EmployeeID, @FirstName, @Zip)";

            sqlCmd.Parameters.AddWithValue("@EmployeeID", employee.EmployeeID);
            sqlCmd.Parameters.AddWithValue("@FirstName", employee.FirstName);
            sqlCmd.Parameters.AddWithValue("@Zip", employee.Zip);

            myConnection.Open();
            int rowInserted = sqlCmd.ExecuteNonQuery();
            myConnection.Close();
        
    

这是Employee 模型:

namespace API.Models

    public class Employee
    
        public int EmployeeID  get; set; 
        public string FirstName  get; set; 
        public int Zip  get; set; 
    

当我使用 Fiddler 使用以下输入测试我的 API 时:

 "EmployeeID":91, "FirstName":"Vader", "Zip":94221

我收到此错误:

HTTP/1.1 415 不支持的媒体类型

没有任何东西被插入到数据库中。

任何指导将不胜感激。

WebApiConfig.cs:

namespace API

    public static class WebApiConfig
    
        public static void Register(HttpConfiguration config)
        
            // Web API configuration and services

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/controller/id",
                defaults: new  id = RouteParameter.Optional 
            );
        
    

根据请求生成的原始错误消息:

HTTP/1.1 415 不支持的媒体类型

缓存控制:无缓存

编译指示:无缓存

内容类型:应用程序/json;字符集=utf-8

过期:-1

服务器:Microsoft-IIS/10.0

X-AspNet-版本:4.0.30319

X-SourceFiles: =?UTF-8?B?YzpcdXNlcnNcYW1lc2tvXGRvY3VtZW50c1x2aXN1YWwgc3R1ZGlvIDIwMTVcUHJvamVjdHNcQVBJXEFQSVxhcGlcRW1wbG95ZWVzXEFkZEVtcGxveWVl?=

X-Powered-By:ASP.NET

日期:格林威治标准时间 2016 年 7 月 22 日星期五 15:33:06

内容长度:986

"Message":"请求包含实体主体,但没有 Content-Type 标头。此资源不支持推断的媒体类型 'application/octet-stream'。",

"ExceptionMessage":"没有 MediaTypeFormatter 可用于从媒体类型为 'application/octet-stream' 的内容中读取类型为 'Employee' 的对象。",

"ExceptionType":"System.Net.Http.UnsupportedMediaTypeException",

"StackTrace":" 在 System.Net.Http.HttpContentExtensions.ReadAsAsync[T](HttpContent 内容,类型类型,IEnumerable1 格式化程序,IFormatterLogger formatterLogger,CancellationToken cancelToken)\r\n 在 System.Net.Http.HttpContentExtensions。 ReadAsAsync(HttpContent content, Type type, IEnumerable1 formatters, IFormatterLogger formatterLogger, CancellationToken cancelToken)\r\n at System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage request, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger, CancellationToken cancelToken )"

【问题讨论】:

你的Content-Type 标头是什么? application/json? 是的。然后我的程序在localhost:55239 上运行,我使用localhost:55239/api/Employees/AddEmployee 访问我的POST 你能发布你的RouteConfig吗? 发布了我在 VisualStudio 中生成的WebApiConfig。我刚刚意识到我一定已经删除了 VS 创建的RouteConfig.cs。我会尝试将其添加回来,看看会发生什么。 请添加通过 Fiddler 发布的原始请求。 【参考方案1】:

您如何传递 JSON 输入?它需要通过请求类型为 application/json 的请求正文

你可以指定你的路线为

"api/controller/action/id"

然后在调用 API url 时将是

http://localhost:63433/api/Employees/AddEmployee

注意控制器不是 URL 的一部分

在请求正文中放

"EmployeeID":91, "FirstName":"Vader", "Zip":94221

将请求类型设为 Post 并请求正文为 application/json

您可以通过 postman 之类的客户端工具测试您的 api 查看屏幕

PostMan

如果您可以发布您的客户代码,我可以检查一下。

【讨论】:

以上是关于Web API Post 返回 415 - 不支持的媒体类型的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用web api发布txt文件,获得415不支持的媒体类型

.net 核心 Web API - 415 不支持的媒体类型

角度 http post 错误 415 .net 核心 web api

伪造Api PATCH请求返回415“不支持的媒体类型”

调用 Web API 2 端点时出现 HTTP 415 不支持的媒体类型错误

github API check_runs 返回 415,“不支持的媒体类型”