2012-11-29 2 views
4

우리는 타사 호스팅 환경에서 호스팅되는 웹 응용 프로그램을 보유하고 있습니다. 서버 응용 프로그램은 일부 WCF RESTFUL 서비스를 iPad 응용 프로그램에 제공합니다..NET 4.5 및 WCF 요청 압축

WCF 서비스는 .svc-less이며 Glonbal.asax 파일에 등록됩니다. 샘플 :

RouteTable.Routes.Add("service name", new ServiceRoute("url", 
    new WebServiceHostFactory(), routingServiceContract)); 

우리는 서버 응용 프로그램에 우리의 iPad 응용 프로그램에서 일부 대용량 데이터를 전송해야하기 때문에

, 요청의 일부는 WCF 서비스로 전송되기 전에 GZIP이 압축됩니다. 우리의 호스팅 제공 업체가 서버에 .NET 4.5이 설치 될 때까지

public void Application_BeginRequest(object sender, EventArgs e) 
{ 
    if (!string.IsNullOrEmpty(Request.Headers["Content-Encoding"])) 
    {     
    if (Request.Headers["Content-Encoding"].ToLower().Contains("gzip")) 
    Request.Filter = new GZipStream(Request.Filter, CompressionMode.Decompress); 

    if (Request.Headers["Content-Encoding"].ToLower().Contains("deflate")) 
     Request.Filter = new DeflateStream(Request.Filter, CompressionMode.Decompress); 
    } 
} 

이 일하고 : 그리고 처음에 .NET 3.5과 같은 코드의 조각을 기반으로 구축 된 서버 응용 프로그램 때문에 압축 requsts을 압축 해제를 담당하고있다 . 그런 다음 압축 된 JSON 요청이 실패하기 시작했습니다 (HTTP 400 또는 가끔 500 오류가 발생 함). WCF 서비스가 .NET 4.5가 설치되지 않은 서버에서 완벽하게 작동하기 때문에 많은 조사가 끝난 후 code 및 web.config 파일은 모두 정상입니다.

위의 코드에 주석을 달아서 같은 서버에 게시했지만 다시 작동하지 않았습니다. 요청이 두 번 해독되었다고 생각했습니다!.

이제 WCF 4.5의 내장 압축 기능을 어떻게 활용하고이 웹 사이트가 작동하는지 궁금합니다. 커스텀 C# 코드를 제거하고 WCF 4.5 압축 기능을 사용하는 것을 선호합니다.

p.s. 웹 서비스는 ASP.NET 호환성 모드에서 실행됩니다.

p.p.s. http 요청을 압축하지 않으면 웹 서비스가 완벽하게 작동합니다.

+0

몇 가지 질문 : (1) 3.5 응용 프로그램 또는 4.0 응용 프로그램입니까? 4.5는 4.0 런타임에 대한 업데이트이므로 3.5 응용 프로그램은 4.5 설치로 영향을받지 않습니다. (2) 압축 코드에 주석을 달고 압축되지 않은 요청을 보내면 호출이 성공한 것을 볼 수 있습니까? (3) web.config와 작은 repro를 게시하여 어디에서 볼 수 있습니까? 바인딩 설정이 어떻게 표시되는지 보는 데 관심이 있습니다. – Praburaj

+0

1- 이것은 .NET 4.0 및 ASP.NET MVC 3.0 응용 프로그램입니다. 2 - 아니, 우리가 도움이되지 않을 압축 코드에 대해 언급하면 ​​안된다. 압축 코드를 유지하고 사이트를 만든 다음 동일한 미리 컴파일 된 웹 사이트를 .NET 4.0 (4.5가 아닌) 서버에 복사합니다. 3 - 여기서 web.config 파일을 게시하려고합니다. 큰 보스에게 허락을 요청할 필요가 있습니다. – Aref

+0

@Praburaj - 명확히하기 위해 압축 코드가 비활성화 된 (또는 활성화 된) _uncompressed_ 요청을 보내면 예상대로 작동합니다. –

답변

0

구성 파일 & Application_BeginRequest 메소드를 완료했습니다. 내 컴퓨터에 .net 4.0으로 설정 파일을 복제하고 정상적으로 작동하는지 확인했다. 또한 같은 설정이 .net 4.5가있는 시스템에서 실패하는 것을 볼 수 있습니다. 내 관찰에 따르면 귀하의 문제는 Application_BeginRequest에있는 압축/압축 해제 코드와 관련이 없습니다. 하지만 당신은이 [게시물] [1]

[1] : WCF - Conflicting endpoints after .Net 4.5 installation "게시물"에 설명 된 것과 동일한 문제에 부딪 히고 있습니다. 이 게시물에서이 문제에 대한 해결 방법을 게시했습니다. 해결 방법은 명시 적으로 REST 엔드 포인트를 정의하는 것입니다. 동일한 작업을 수행 할 때마다 프로젝트가 시작되었다는 것을 알 수있었습니다. 정확하게 프로젝트를 작동 시키려면 config에이 두 줄을 추가하고 서비스 끝점을 명시 적으로 구성해야합니다.

<services> 
     <service name="<YourNamespace>.TestService"> 
     <endpoint address="" binding="webHttpBinding" contract="<YourNamespace>.TestService" behaviorConfiguration="RESTEndpointBehavior"/> 
     </service> 
    </services> 

이것이 문제를 해결할 수 있는지 확인할 수 있습니까?

+0

''과''요소는'ServiceRoute'을 사용할 때 무시되었습니다. 그렇지 않은가요? –

+0

나는 그것이 작동한다고 생각한다. 그게 효과가 있는지 알려주세요. – Praburaj

+0

명시 적 서비스 끝점을 추가하면 서비스 메서드 ("[endpointaddress]/method")가 404가됩니다. 그러나 serviceHostingEnvironment를 제외한 * 모든 system.serviceModel 구성 *을 제거하면 여전히 압축되지 않은 요청이 예상대로 작동합니다 (의심 할 여지없이 ServiceRoute). 그러나 BeginRequest 코드가 해당 요청에 대해 실행 되더라도 압축 된 요청은 여전히 ​​400으로 실패합니다. –