在IIS上向Asp.Net(非核心)Web Api错误415进行角度发布

时间:2018-08-30 09:34:40

标签: c# angular iis asp.net-web-api cors

在进行简单的Web Api调用时,我完全发疯了,我感到沮丧,因为事情要复杂得多。

我创建了一个非常简单的Web Api(用于测试),供Angular 6客户端使用,如果我在本地自行托管它,但如果将其发布到Win10本地IIS(是将其部署到服务器时的工作方式),然后对Web Api的请求将失败,并出现错误415“不支持的媒体类型”。

奇怪的是,如果我向自托管的Web Api(有效)浏览器的“网络”选项卡发出请求,与向IIS发布的版本发出请求完全不同。

这是我的Web Api方法:

[HttpPost]
[HttpOptions]
public void Post([FromBody]Credentials cred)
{
    string strTest = "I'm doing just nothing";
}

我不得不提到,由于CORS,我花了整整一个上午的时间才能使其甚至可以自托管,并且关键是在方法标题中添加了[HttpOptions]。

班级凭证:

public class Credentials {
    public string Username { get; set; }
    public string Password { get; set; }
}

有角邮政编码:

let headers={
    headers: new HttpHeaders({
        'Accept': 'application/json',
        'Content-Type': 'application/json; charset=UTF-8'
    })
}

return this.http.post<any>('http://localhost:9810/api/Login', JSON.stringify({username, password}), headers) ...

自托管(工作状态一)时的“网络”标签信息:

General:
Request URL: http://localhost:9000/api/Login
Request Method: OPTIONS
Status Code: 204 No Content
Remote Address: [::1]:9000
Referrer Policy: no-referrer-when-downgrade

Response Headers:
Content-Length: 0
Date: Thu, 30 Aug 2018 09:24:50 GMT
Server: Microsoft-HTTPAPI/2.0

Request Headers:
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: es-ES,es;q=0.9,en;q=0.8
Access-Control-Request-Headers: content-type
Access-Control-Request-Method: POST
Connection: keep-alive
Host: localhost:9000
Origin: http://localhost:4200
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36

发布到本地IIS时的“网络”标签信息(无效):

General:
Request URL: http://localhost:9810/api/Login
Request Method: OPTIONS
Status Code: 415 Unsupported Media Type
Remote Address: [::1]:9810
Referrer Policy: no-referrer-when-downgrade

Response Headers:
Content-Length: 801
Content-Type: application/json; charset=utf-8
Date: Thu, 30 Aug 2018 08:57:58 GMT
Server: Microsoft-IIS/10.0
X-Powered-By: ASP.NET

Request Headers:
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: es-ES,es;q=0.9,en;q=0.8
Access-Control-Request-Headers: content-type
Access-Control-Request-Method: POST
Connection: keep-alive
Host: localhost:9810
Origin: http://localhost:4200
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36

因此,如您所见,当Web Api发布到IIS时,“网络”选项卡中的输出将有所不同,并且标头没有到达。

我完全陷入困境,让朋友们沮丧。请帮忙。

编辑1:我添加了WebApiConfig,在这里您可以看到我启用了cors以防万一。

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        var cors = new EnableCorsAttribute("http://localhost:4200", "*", "*");
        config.EnableCors(cors);
    }
}

1 个答案:

答案 0 :(得分:1)

同样,我永远也不会理解为什么事情本不应该如此复杂(有时是矛盾的)。

我能够在自托管的Web Api中成功发出请求并在IIS Web Api中发布的方法是用application / x-www-form-urlencoded替换application / json,但为什么呢?这很矛盾,因为我显然正在发送json数据。

无论如何,它不起作用,所以我将自己的问题标记为已解决。

let headers={
    headers: new HttpHeaders({
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
    })
}