我有两个应用程序,其中一个托管在 Azure 应用服务 (.NET Framework 4.8) 中,并公开(除其他外)两个接收 POST 请求的端点:
端点A:
[AcceptVerbs("GET", "POST")]
public async Task<HttpResponseMessage> EndpointA([FromUri]Guid sessionId, [FromUri]Guid transactionId, [FromBody]ADataDTO data)
Run Code Online (Sandbox Code Playgroud)
端点B:
[AcceptVerbs("GET", "POST")]
public async Task<HttpResponseMessage> EndpointB(Guid sessionId, Guid transactionId, [FromBody] BDataDTO data)
Run Code Online (Sandbox Code Playgroud)
使用 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);
}
Run Code Online (Sandbox Code Playgroud)
和
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);
}
Run Code Online (Sandbox Code Playgroud)
现在,这两个调用在本地都可以完美运行,但是当发布到 Azure 应用服务时,对 EndpointB 的调用可以运行,而对 EndpointA 的调用则不能。
经过一番调查,我注意到对 EndpointA 的调用最终以 GET 而不是 POST 的形式结束,这是不可能的(让我指出,在本地两者都工作正常)。
因此,经过几个小时的调查和尝试我能想到的一切之后,我弄清楚了这两个调用之间的区别以及为什么我的 POST 变成了 GET。
对于 EndpointA,在我的测试环境中,callbackUrl 以 http 开头,而对于 EndpointB,它以 https 开头。
现在,Azure 应用服务使用仅 HTTPS 选项托管应用程序,该选项(来自文档)执行以下操作:
默认情况下,应用服务强制从 HTTP 请求重定向到 HTTPS
再往下看,HttpClient 在重定向时将请求转变为 GET,因此我的 POST 端点上没有数据:)
我希望这会节省一些时间:)
| 归档时间: |
|
| 查看次数: |
490 次 |
| 最近记录: |