2015-11-03 85 views
3

我有一个基本的ASP .NET WebAPI项目。有一个PdfFileControllerASP .NET WebAPI无法访问路线

[RoutePrefix("api/pdffile")] 
public class PdfFileController : ApiController 
{ 
    [HttpPost] 
    [Route("upload")] 
    public async Task<dynamic> Upload(dynamic uploadedData) 
    { 
     List<object> files = uploadedData.pdfs; 
     // ... 
    } 
} 

而且在客户端上我有使用Oboe POST请求:

oboe({ 
    url: this.props.configuration.rootApiUrl + 'pdffile/upload', 
    method: 'POST', 
    body: { pdfs: pdfs } 
}).node('pdfsAsImages.*', function(pdf){ // This callback will be called every time a new pdf image comes in 
    channel.pub('pdf.converted', pdf); 
}); 

POST请求的URL解析为http://localhost:49706/api/pdffile/upload。从这个请求,收到此消息:

OPTIONS http://localhost:49706/api/pdffile/upload

的XMLHttpRequest不能加载http://localhost:49706/api/pdffile/upload。 对预检请求的响应未通过访问控制检查:否 请求的 资源上存在“访问控制 - 允许来源”标头。因此不允许原产地'null'访问。响应 了HTTP状态码405

我的静态HTML和JS文件被从本地简单的python文件服务器提供的位于localhost:8000。

击中http://localhost:49706/api/pdffile/upload与邮差返回此:

{ “消息”:“请求实体的媒体类型‘多部分/格式数据’不支持该资源。”, “ExceptionMessage”: “没有MediaTypeFormatter可用于从媒体类型为'multipart/form-data'的内容读取'Object'类型的对象。”, “ExceptionType”:“System.Net.Http.UnsupportedMediaTypeException”, “StackTrace”:“在System.Net.Http.HttpContentExtensions.ReadAsAsync [T](HttpContent内容,类型类型,IEnumerable`1格式化程序,IFormatterLogger formatterLogger,CancellationToken的CancellationToken个)\ r \ n在System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage请求,类型类型,IEnumerable`1格式化,IFormatterLogger formatterLogger,的CancellationToken的CancellationToken)” }

所以可能有几个这里发生的问题。我的问题是我必须做些什么来克服“否”访问控制 - 允许来源'标题存在'的问题?在我看来,它与多个服务器有关,一个用于静态文件服务,另一个用于路由。我想保持这个设置。

+0

您可能希望在服务器应用程序上启用[启用CORS](http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api)。 –

回答

2

允许CORS(跨域请求)尝试在指定的webapiconfig.cs /注册

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     var cors = new EnableCorsAttribute("www.example.com", "*", "*"); 
     config.EnableCors(cors); 
     // ... 
    } 
} 

这需要Microsoft.AspNet.Cors NuGet包。