HTTP POST请求在Azure应用服务上转向GET

ua4mk5z4  于 2023-06-24  发布在  其他
关注(0)|答案(1)|浏览(137)

我有两个应用程序,其中一个托管在Azure App Service(.NET Framework 4.8)中,并公开(除其他外)两个接收POST请求的端点:
终点A:

[AcceptVerbs("GET", "POST")]
public async Task<HttpResponseMessage> EndpointA([FromUri]Guid sessionId, [FromUri]Guid transactionId, [FromBody]ADataDTO data)

终点B:

[AcceptVerbs("GET", "POST")]
public async Task<HttpResponseMessage> EndpointB(Guid sessionId, Guid transactionId, [FromBody] BDataDTO data)

这两个端点都以相同的方式调用,通过使用HttpClient.PostAsync方法:

public async Task CallEndpointAAsync(string callbackUrl, ADataDTO data)
    {
        //... validations

        var httpClient = httpClientFactory.CreateClient();
        httpClient.DefaultRequestHeaders.Add("Accept", "application/json");

        var jsonObject = JsonConvert.SerializeObject(data, jsonSerializerSettings);
        var content = new StringContent(jsonObject, Encoding.UTF8, "application/json");
        await httpClient.PostAsync(callbackUrl, content);
    }

和/或

public async Task CallEndpointBAsync(string callbackUrl, BDataDTO data)
    {
        //... validations

        var httpClient = httpClientFactory.CreateClient();
        httpClient.DefaultRequestHeaders.Add("Accept", "application/json");

        var jsonObject = JsonConvert.SerializeObject(data, jsonSerializerSettings);
        var content = new StringContent(jsonObject, Encoding.UTF8, "application/json");
        await httpClient.PostAsync(callbackUrl, content);
    }

现在,在本地,这两个调用都可以完美地工作,但是当发布到Azure App Service时,对EndpointB的调用可以工作,而对EndpointA的调用则不能。
经过一些调查,我注意到对EndpointA的调用以GET而不是POST结束,这是不可能的(让我指出,本地都工作正常)。

smdnsysy

smdnsysy1#

所以,经过几个小时的调查和尝试我能想到的一切,我弄清楚了这两个调用之间的区别,以及为什么我的POST变成了GET。
在我的测试环境中,对于EndpointA,callbackUrl以http开头,而对于EndpointB,它以https开头。
现在,Azure应用服务托管仅使用HTTPS选项的应用,该选项(来自文档)执行以下操作:
默认情况下,App Service强制将HTTP请求重定向到HTTPS
来源:Azure HTTPS仅选项
再往下,HttpClient在重定向时将请求转换为GET,因此我在POST端点上没有得到任何数据:)
我希望这能保存一些时间:)

相关问题