C# 将PDF文件从Fiddler上载到WebAPI方法会导致415种不受支持的媒体类型

C# 将PDF文件从Fiddler上载到WebAPI方法会导致415种不受支持的媒体类型,c#,asp.net,asp.net-mvc-4,pdf,asp.net-web-api,C#,Asp.net,Asp.net Mvc 4,Pdf,Asp.net Web Api,我试图将PDF文件上载到我的WebAPI方法,但收到415不支持的媒体类型错误。我是否需要在我的WebApiConfig.cs文件中放入特定的内容以允许使用PDF格式化程序 这是我的控制器代码的签名: [HttpPost] public HttpResponseMessage SavePdf(HttpPostedFileBase file) { string fileLocation = @"\\server\shared\appname\

我试图将PDF文件上载到我的WebAPI方法,但收到415不支持的媒体类型错误。我是否需要在我的WebApiConfig.cs文件中放入特定的内容以允许使用PDF格式化程序

这是我的控制器代码的签名:

[HttpPost]
        public HttpResponseMessage SavePdf(HttpPostedFileBase file)
        {
            string fileLocation = @"\\server\shared\appname\";
            ...
我的WebAPI当前托管在
localhost
上。我从Fiddler调用这个WebAPI方法。这是Fiddler的“Composer”选项卡(然后单击蓝色上传文件链接上传我的PDF):

以下是Fiddler中产生的HTTP 415错误:


我的直觉是我需要告诉我的WebAPI接受PDF媒体类型(application/PDF),但我不确定。。。有什么想法吗?

这意味着文件格式不是在
global.asax中配置的预期媒体格式:

var config = System.Web.Http.GlobalConfiguration.Configuration;
config.Formatters.Insert(0, new System.Net.Http.Formatting.JsonMediaTypeFormatter());
您可以做两件事,一是实现meadia格式以接受文件,或者您可以调整一个控制器以接受文件,如下所示:

public class UploadController : ApiController
{
    public async Task < HttpResponseMessage > PostFormData() 
    {
        var root = HttpContext.Current.Server.MapPath("~/App_Data");
        var provider = new MultipartFormDataStreamProvider(root);

        try 
        {
            // Read the form data.
            await Request.Content.ReadAsMultipartAsync(provider);

            // Show all the key-value pairs.
            foreach(var key in provider.FormData.AllKeys) 
            {
                foreach(var val in provider.FormData.GetValues(key)) 
                {
                    var keyValue = string.Format("{0}: {1}", key, val);
                }
            }

            foreach(MultipartFileData fileData in provider.FileData) 
            {
                var fileName = fileData.Headers.ContentDisposition.FileName;
            }
            return Request.CreateResponse(HttpStatusCode.OK);
        } 
        catch (Exception e) 
        {
            return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
        }
    }
}
...
公共类上载控制器:ApiController
{
公共异步任务PostFormData()
{
var root=HttpContext.Current.Server.MapPath(“~/App_Data”);
var provider=新的MultipartFormDataStreamProvider(根);
尝试
{
//读取表单数据。
wait Request.Content.ReadAsMultipartAsync(提供程序);
//显示所有键值对。
foreach(provider.FormData.AllKeys中的var键)
{
foreach(provider.FormData.GetValues(键)中的var val)
{
var keyValue=string.Format(“{0}:{1}”,key,val);
}
}
foreach(provider.fileData中的MultipartFileData文件数据)
{
var fileName=fileData.Headers.ContentDisposition.fileName;
}
返回Request.CreateResponse(HttpStatusCode.OK);
} 
捕获(例外e)
{
返回请求.CreateErrorResponse(HttpStatusCode.InternalServerError,e);
}
}
}
...
您可以在此处阅读更多信息:


您只需阅读下面的这篇文章:

不要使用
HttpPostedFileBase
作为参数,因为Web API尝试使用配置中的格式化程序对请求内容进行建模绑定…Web API内部没有用于多部分的格式化程序…您需要以特定方式读取多部分请求内容…还需要从MVC中读取
HttpPostedFileBase


关于文件名,您可以查看上面文章中的这一行
file.Headers.ContentDisposition.FileName

您如何在Web Api控制器中读取请求内容?检查这张图片:@KiranChalla它甚至从未到达
SavePdf
的入口点-我在第一个大括号处设置了一个断点,所以为了回答您的问题,它甚至从未到达该点。这就是为什么我的直觉是我需要给WebApiConfig.cs添加一些东西,但是我确定。哦,等等。不要使用
HttpPostedFileBase
。这是在MVC中使用的。取而代之的是,不要使用任何参数,只需按照我上面提到的文章进行操作。@KiranChalla那么我如何从上传的文件中获取文件名,以便在代码中使用,从而将此文件保存到共享中?这里有任何一位plz可以帮助我: