2014-01-15 2 views
1

서버의 파일을 사용하여 처리하는 WebAPI 컨트롤러에 파일을 보내려고합니다. 내가 2 메가 바이트보다 큰 파일을 시도 할 때까지 모든 것이 잘 작동하는 것 같다 ... 이보다 큰 파일은 이상한 예외를 던지고있는 것 같다. 여기 파일 크기가 큰 경우에만 PostAsync를 사용하는 WebAPI가 예외를 throw합니다.

은 조각이다 :

예외는 라인에 발생합니다
 var progress = new ProgressMessageHandler(); 
     progress.HttpSendProgress += ProgressEventHandler; 
     HttpClient client = HttpClientFactory.Create(progress); 
     client.Timeout = TimeSpan.FromMinutes(20); 
try 
       { 
        using (
         var fileStream = new FileStream(file, FileMode.Open,  FileAccess.Read, FileShare.Read, 1024, 
         useAsync: true)) 
       { 
        var content = new StreamContent(fileStream, 1024); 
        var address = new Uri(string.Format("{0}api/File/Upload?submittalId={1}&fileName={2}&documentTypeId={3}", FileServiceUri, tabTag.submittalId, Path.GetFileName(file), documentTypeId)); 
        client.MaxResponseContentBufferSize = 2147483647; 
        var response = await client.PostAsync(address, content); 
        var result = response.Content.ReadAsAsync<object>(); 
        if (!response.IsSuccessStatusCode) 
         continue; 
       } 

:

var response = await client.PostAsync(address, content);

하고 있습니다 : 그것은 심지어 타격 아니에요

No MediaTypeFormatter is available to read an object of type 'Object' from content with media type 'text/html'

처음에 중단 점 f 내 서비스 컨트롤러 그래서 그 코드를 포함 (비록 내가 할 수 있지만 잠재적으로 문제). 위에서 말했듯이 이것은 2MB 이상의 파일에서만 발생합니다. 작은 파일은 잘 작동합니다 (신에게 감사드립니다. 그래서 데모를 보여줄 수 있습니다 ^^).

Anyhelp를 사용하시면 크게 감사하겠습니다.

+0

어떻게 웹 API를 호스팅하고 있습니까? 자기 주인? ASP.NET? –

+0

asp.net을 통해 로컬 및 배포 – timmyda

답변

3

코리의 관찰은 바로 해당 웹 API는 내장 포맷이없는됩니다. 내 생각 엔 당신이 아마 HTML에서 오류 응답을 받고있다. 실제로 그럴 경우 다음을 수행 할 수 있습니다.

파일을 IIS 호스트 웹 API 응용 프로그램에 업로드 할 때 다음 사항을 처리해야합니다.

주 (maxRequestLength의이 = "킬로의 크기가 바이트") :

<system.web> <httpRuntime targetFramework="4.5" maxQueryStringLength="" maxRequestLength="" maxUrlLength="" /> 

참고

당신은 업로드 크기를 증가의 Web.config에서 다음이 설정을 볼 필요가 (Length 요청 헤더 바이트에) :

<system.webServer> <security> <requestFiltering> <requestLimits maxAllowedContentLength="" maxQueryString="" maxUrl=""/> 

이 또한주의 기본 버퍼는 IIS에서 호스팅되는 시나리오의 웹 API 정책은 buffered이므로 대용량 파일을 업로드하는 경우 요청이 많은 메모리를 소비하게됩니다. 다음과 같은 정책을 변경할 수 없도록하려면

config.Services.Replace(typeof(IHostBufferPolicySelector), new CustomBufferPolicySelector()); 

//--------------- 

public class CustomBufferPolicySelector : WebHostBufferPolicySelector 
{ 
    public override bool UseBufferedInputStream(object hostContext) 
    { 
     return false; 
    } 
} 
+0

webconfig 항목이 내 문제를 해결했습니다. 많은 감사합니다! – timmyda

+0

답변으로 표시 할 수 있습니까? :-) –

+0

완료 ... 고마워 다시 친구. – timmyda

1

는 응답은 text/html 콘텐츠 형식으로 돌아오고, 그리고 ReadAsAsync<object>()objecttext/html을 역 직렬화하는 방법을 알고하지 않습니다.

웹 앱이 특정 크기의 파일 만 허용하도록 구성되었으며 친숙한 HTML 메시지로 오류를 반환합니다. 당신은 내용을 역 직렬화하기 전에 응답 코드를 확인해야합니다 직렬화 또는 텍스트/HTML 콘텐츠를 역 직렬화 중 하나에

var response = await client.PostAsync(address, content); 
response.EnsureSuccessStatusCode(); 
+0

나는 오류 메시지를 반환하고있는이 긴 행을 생각하고 있었고, 이것을 시도하고 다시 연락 할 것입니다. 빠른 응답 주셔서 감사합니다 – timmyda

+0

이것은 실제로 예외를 중지하고 내부 서버 오류를 나타냅니다. – timmyda

+0

기꺼이 도와 드리겠습니다! Kiran은 큰 파일을 받아들이도록 서버 측 코드를 수정하는 좋은 조언을 게시 했으므로 문제를 해결할 수 있습니다. –

관련 문제