2012-09-12 3 views
12

VS 2012를 설치했으며 일부 웹 프로젝트에서 성공적으로 사용하고 있지만 그로 인해 웹 서비스 프로젝트가 중단되었습니다. 여전히 웹 서비스 프로젝트에서 VS 2010을 사용하고 있으며 2012 년에 열지 않았습니다.Visual Studio 2012 설치시 내 2010 WCF 프로젝트가 깨졌습니다.

참조 된 웹 로그 프로젝트에서 클래스의 인스턴스를 만들려고 시도하는 경우를 제외하고 모든 항목이 올바르게 컴파일되고 작동합니다. 오류 :

이 메서드 또는 속성은 HttpRequest.GetBufferlessInputStream이 호출 된 후에 지원되지 않습니다.

GetBufferlessInputStream이 명시 적으로 사용 된 프로젝트의 어느 위치에서도 찾을 수 없습니다.

웹 로그 코드를 뛰어 넘으면 모든 것이 올바르게 실행됩니다.

이 오류를받은 다른 사용자를 찾아 범위를 좁히려면 찾을 수 없습니까?

스택

at System.Web.HttpRequest.get_InputStream() 
    at OAS.Web.Log.WebEvent..ctor(EventType type, HttpContext context, String applicationName) 
    at OAS.Web.Log.WebTrace..ctor(HttpContext context, String applicationName) 
    at OAS.Web.AdvisorServices.Extensions.OperationLoggerParameterInspector.BeforeCall(String operationName, Object[] inputs) in C:\SourceControl\OAS\IM.NET3.0\Web\AdvisorServices\OAS.Web.AdvisorServices.Extensions\OperationLogger\OperationLoggerParameterInspector.cs:line 54 



** 편집 -

왜 이러한 프레임 워크 4.5 속성 내 4.0 솔루션에 영향을 미치는 보너스 질문

?

+0

나는 그렇다고 가정 하겠지만 ... 당신의 솔루션을 "청소"했습니까? – zapico

+1

방금 ​​청소하고 다시 작성했지만 변경되지 않았습니다. 마이크로 소프트 녀석이 여기에 대한 대답을했지만 지금은 사라졌습니다. WCF 모듈이 호출되기 전에 get_InputStream을 호출해야하는 HttpModule을 만들어야하고 ReadEntityBodyMode 속성을 none 대신 클래식으로 설정해야하지만 wcf보다 먼저 내 모듈을 강제로 강제 실행하는 방법을 알지 못했습니다. . –

+0

보너스 :이 작업을 수행하는 것은 싫지만 http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/c05a8c02-de67-47a9-b4ed-fd8b622a7e4a를 참조하십시오. 짧은 대답 : .NET 4.5는 적절한 업그레이드이며 실제로 .NET 4.0의 버그를 수정합니다. –

답변

27

참고 :이 문제는 .net 4.5.1에서 수정되었습니다. 4.5.1의 수정 사항을 볼 수 있습니다. 일단 당신이. NET 4.5.1 이전 동작으로 다시 전환하려면 다음 appSetting을 추가합니다. 여기

<configuration>  
<appSettings> 
     <add key="wcf:serviceHostingEnvironment:useClassicReadEntityBodyMode" value="true" /> 
</appSettings> 
</configuration> 

는 "고전"으로 ReadEntityBodyMode을 강제로 HttpModule을 만드는 방법이다 : (? 이러한 프레임 워크 4.5 속성 내 4.0 솔루션을 초래하는 이유) http://blogs.msdn.com/b/praburaj/archive/2012/09/13/accessing-httpcontext-current-request-inputstream-property-in-aspnetcompatibility-mode-throws-exception-this-method-or-property-is-not-supported-after-httprequest-getbufferlessinputstream-has-been-invoked.aspx

은 다른 질문에 대답하기를 : .net 4.5는 .net 4.0의 적절한 업그레이드입니다. 그래서 프로젝트가 4.0을 목표로하더라도 VS 2012가 4.5 런타임을 설치하기 때문에 4.5 행동 중 일부가 효과가 있습니다.

EDIT

블로그 항목 : .NET 4.5 WCF에서

확장 성 혜택 버퍼 적은 입력 스트림을 활용. 결과적으로 HttpContext.Current.Request.InputStream 속성에 액세스하려고하면 InputStream 속성이 모두 호환되지 않아 Classic 스트림을 처리하려고하기 때문에 아래 예외가 발생할 수 있습니다.

“This method or property is not supported after HttpRequest.GetBufferlessInputStream has been invoked.”

당신은 4에 .NET Framework를 업그레이드하는하지만 완벽하게 일한 WCF 4.0 응용 프로그램을 가지고 있다면.

  • 는 WCF 읽기 전에 각 요청에 대한의 InputStream 속성에 액세스 것 같은 WCF 프로젝트에 간단한 HttpModule을 추가 : 5는 서비스가이 속성에 액세스에 실패 통지, 여기에 해결 방법 할 수있는 문제 방법입니다 HttpContext.Request.ReadEntityBody를 "Classic"으로 강제 적용하여 호환성을 보장합니다.

    public class WcfReadEntityBodyModeWorkaroundModule : IHttpModule  
    {  
        public void Dispose() { } 
    
        public void Init(HttpApplication context) {  
         context.BeginRequest += context_BeginRequest;  
        }  
    
        void context_BeginRequest(object sender, EventArgs e) { 
         //This will force the HttpContext.Request.ReadEntityBody to be "Classic" and will ensure compatibility..  
         Stream stream = (sender as HttpApplication).Request.InputStream;  
        }  
    } 
    
  • 등록 <configuration><modules> 설정에서 다음 줄을 추가하여 Web.config의에서이 모듈.

    <system.webServer> 
        <modules> 
         <!-- Register the managed module --> 
         <add name="WcfReadEntityBodyModeWorkaroundModule" type="MyAssembly.WcfReadEntityBodyModeWorkaroundModule, MyAssembly" /> 
        </modules> 
    
  • 클래식 모드에서 응용 프로그램 풀을 사용하는 경우, 당신은 Web.config의이 섹션에 모듈을 추가해야합니다

    <system.web> 
        <httpModules> 
         <add name="WcfReadEntityBodyModeWorkaroundModule" type="MyAssembly.WcfReadEntityBodyModeWorkaroundModule, MyAssembly" /> 
        </httpModules> 
    

을 프로젝트가 될 수없는 경우 이 Http 모듈을 별도의 어셈블리 인 GAC에 별도로 작성하고이 모듈을 web.config에 등록 할 수 있습니다.

이제 성공할 서비스에 액세스하십시오!

+4

오늘 내 엉덩이를 저장했습니다. 감사! –

+0

Saved my ass # 2 – Paden

+1

이유는 모르겠지만, 저에게는 효과가 없습니다. WcfReadEntityBodyModeWorkaroundModule 코드를 복사하고 web.config에 모듈 구성을 추가했습니다. ReadEntityBodyMode는 여전히 Bufferless입니다. 나는 4.5를 사용하고있다. 거기에 더 많은 것이 있습니까? – bsayegh

관련 문제