2012-09-12 24 views
12

Instalé VS 2012 y lo estoy usando con éxito en algunos proyectos web, pero algo con eso ha hecho que mi proyecto de servicio web se rompa. Todavía utilizo VS 2010 en el proyecto de servicio web y no lo abrí en 2012.La instalación de Visual Studio 2012 rompió mi proyecto de WCF de 2010

Todo se compila y funciona correctamente, excepto cuando intenta crear una instancia de una clase en el proyecto de weblog referenciado, luego arroja esto error:

Este método o propiedad no es compatible después de que se haya invocado HttpRequest.GetBufferlessInputStream.

No puedo encontrar ningún lugar en el proyecto donde GetBufferlessInputStream se usa explícitamente.

Si salta sobre el código del weblog, todo se ejecuta correctamente.

No puedo encontrar a nadie más que haya recibido este error para tratar de restringirlo, ¿alguna idea de dónde empezar?

Pila

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 



** EDITAR - Pregunta extra

¿Por qué estas propiedades Framework 4.5 afectando mi solución 4.0?

+0

Supongo que sí, pero ... ¿"limpió" su solución? – zapico

+1

Recién limpiado y reconstruido, sin cambios. Un chico de Microsoft tenía una respuesta aquí, pero ahora se ha ido. Dije que debería intentar crear un HttpModule que debería llamar al get_InputStream antes de llamar al módulo WCF y forzaría la propiedad ReadEntityBodyMode a classic en lugar de none, pero no estaba seguro de cómo forzar a mi módulo a ser golpeado antes que el wcf . –

+0

Bonificación: odio hacerte esto, pero mira http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/c05a8c02-de67-47a9-b4ed-fd8b622a7e4a. Respuesta corta: .NET 4.5 es una actualización in situ y, de hecho, corrige errores en .NET 4.0. –

Respuesta

27

Nota: Este problema se ha solucionado en .net 4.5.1. Puedes ver la solución con 4.5.1. Una vez que tenga .net 4.5.1 agregue la siguiente appSetting para volver al comportamiento anterior.

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

Aquí es cómo se puede crear un HttpModule para forzar ReadEntityBodyMode ser "clásico": (¿Por qué son estos Framework 4.5 propiedades están efectuando mi solución 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

para responder a su otra pregunta: ¿ .net 4.5 es una actualización in situ de .net 4.0. Por lo tanto, incluso si su proyecto tiene como objetivo 4.0, ya que VS 2012 instala 4.5 tiempo de ejecución, algunos de los 4.5 comportamientos entran en vigencia.

EDITAR

Blog Entrada:

En .NET 4.5 WCF apalancado la memoria intermedia de menos flujo de entrada para los beneficios de escalabilidad. Como resultado, cuando intenta acceder a la propiedad HttpContext.Current.Request.InputStream, puede terminar con la siguiente excepción, ya que la propiedad InputStream intenta hacer que maneje la transmisión Classic, ya que ambos son incompatibles.

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

Si tiene una aplicación WCF 4.0 que funcionó a la perfección, pero en la actualización de su .NET Framework a 4.5 se observa el servicio en su defecto en el acceso a esta propiedad, aquí es la forma de trabajo en torno a la cuestión:

  • Añadir un HttpModule simple en el mismo proyecto de WCF que acceder a la propiedad InputStream para cada solicitud antes de WCF lee para que haga que HttpContext.Request.ReadEntityBody sea "Clásico" y garantizará la compatibilidad.

    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;  
        }  
    } 
    
  • Registro este módulo en su web.config añadiendo estas líneas en <configuration><modules> ajuste.

    <system.webServer> 
        <modules> 
         <!-- Register the managed module --> 
         <add name="WcfReadEntityBodyModeWorkaroundModule" type="MyAssembly.WcfReadEntityBodyModeWorkaroundModule, MyAssembly" /> 
        </modules> 
    
  • Si está utilizando un grupo de aplicaciones en modo clásico, se le debe agregar el módulo a esta sección en el web.config:

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

Si el proyecto no puede ser modificado, luego puede escribir este módulo Http en un ensamble separado, GAC por separado y registrar este módulo en el web.config.

¡Ahora intente acceder al servicio que debería tener éxito para usted!

+4

Esto me salvó el culo hoy. ¡Gracias! –

+0

Guardado mi culo # 2 – Paden

+1

No tengo idea por qué, pero esto no funcionó para mí. Copié el código WcfReadEntityBodyModeWorkaroundModule y agregué la configuración del módulo a web.config. ReadEntityBodyMode todavía está sin buffer. Estoy usando 4.5. ¿Hay algo más para eso? – bsayegh

Cuestiones relacionadas