Azure App 서비스에 배포 된 AspNetCore에 WebApi가 있습니다. WebApi는 객체 배열을 게시하는 데에만 사용할 수 있습니다. 객체에는 많은 속성 (100 개 이상)과 3 개의 객체 배열이 포함됩니다. (그것은 건물을 나타냅니다). 객체 배열에는 각각 300 개가 넘는 객체가 포함될 수 있습니다.대규모 요청시 Azure 연결 설정의 웹 API가 실패 함
Visual Studio 2017 (15.4.1)에서 디버깅 할 때 api가 제대로 작동하고 모든 요청을 수락합니다. Azure에 배포하면 대부분의 요청을 받아들입니다. 그러나 몇몇은 무효로 사라집니다. 그 말은 응답이 전혀 없다는 의미입니다. 잘못 된 요청에는 배열 중 하나에 많은 객체가 있습니다. 오브젝트의 양을 특정 숫자로 줄이면 요청이 승인됩니다. 마찬가지로 Visual Studio에서는 모든 요청이 수락됩니다. 데이터 전송은 견고합니다.
나는 인터페이스가 동일하지만 로직이없고 테스트 응답을 "succes"로 만들었습니다! 이 인터페이스에서 요청도 실패합니다 (동일한 동작). Newtonsoft (10.0.3)는 비 직렬화를 위해 두 컨트롤러에서 사용됩니다.
이러한 요청에 따라 이러한 동작의 차이가 발생할 수있는 원인은 무엇입니까?
컨트롤러의 코드 :
public class TestController : Controller
{
[HttpPost]
[RequireHttps]
public IActionResult Post([FromBody] Buildings Buildings)
{
enumActionResult status = enumActionResult.success;
try
{
if (Buildings == null)
throw new Exception("No valid buildings posted!");
if (Buildings.items == null)
throw new Exception("No valid building items posted!");
if (Buildings.items.Count == 0)
throw new Exception("Zero building items posted!");
return Json(new response() { status = status.ToString(), Buildings = list
}
catch (Exception ex)
{
return Json(new ErrorResponseFormat() { message = ex.Message, status = enumActionResult.error, data = new ErrorResponse(ex) });
}
}
}
업데이트 (2017년 12월 19일) : 문제는 여전히 존재하지만, SSL로 좁혀된다. 나는 실패 URL에 HTTPS와 요청을하고, 나는 그것이 succesfull 인 HTTP의 URL에 동일한 요청을 발사하면
public class EchoController : Controller
{
[HttpPost]
public IActionResult Post()
{
return new FileStreamResult(Request.Body, Request.ContentType);
}
}
: 난 단지 요청을 반환하는 새로운 컨트롤러를 만들었습니다. 이것은 http 만 사용하기 때문에 디버거에서 얻은 것과 동일한 동작입니다. 따라서 디버거와 하늘 구름 환경 사이의 차이점 대신 http와 https가 문제가되는 것 같습니다. (브루스 첸에 의해 제안) 내가 설정에서 구현 한편
:
<system.webServer>
<security>
<requestFiltering>
<!-- Measured in Bytes -->
<requestLimits maxAllowedContentLength="4000000000" maxQueryString="100000000"/>
<!-- 1 GB, Byte in size, up to 2GB-->
</requestFiltering>
<access sslFlags="Ssl, SslRequireCert"/>
</security>
</system.webServer>
및 .NET 4.6.2로 업그레이드. 이 시점에서 여전히 해결책은 없지만 문제는 좁혀진 것처럼 보입니다.
업데이트 (20-12-2017)은 : 나는 다음과 같은 흥미로운 점을 발견 : 나는 분실 된 (HTTPS) API에 "대형"요청을 보낼 때. 그러나 작은 요청이 선행 될 때 두 요청이 모두 허용됩니다. 따라서 큰 요청이있는 연결 설정이 실패한 것처럼 보입니다.
webapi는 사용자 정의 도메인 https 및 IP 허용 목록을 사용합니다. 클라이언트는 클라이언트 인증서로 인증해야합니다. 전체 Webapi의 설정 (예, 이전에 requestLimits 항목을 제거) :
configuration>
<connectionStrings>
...
</connectionStrings>
<system.webServer>
<security>
<access sslFlags="Ssl, SslRequireCert"/>
</security>
</system.webServer>
<runtime>
<gcServer enabled="true"/>
</runtime>
</configuration>
그리고 클라이언트 인증서를 사용하여, 우체부이다. 이견있는 사람?
우리는 몇 가지 코드 또는 로그 또는 뭔가를 보거나 그냥 추측 할 것입니다 ... – Milney
여기에 아무도 어떤 코드를 게시 할 필요가있는 심령술사가 없습니다. 잠재적으로 잘리는 POST 요청 및 GET이 아닌지 확인하고 있습니까? 당신은 newsoft가 deserialization에 사용되는 것을 의미합니까? 사용자 정의 모델 바인더를 가지고 있습니까? 아니면 코드로 JSON –
을 보냈습니까? 사용자 정의 모델 바인더가 사용되지 않습니다. – Martijn