HttpContext.Current.Request.InputStream屬性拋出異常「在調用HttpRequest.GetBufferlessInputStream以後不支持此方法或屬性。

在.net 4.5中,WCF利用緩衝區較少的輸入流來實現可伸縮性優點。所以,當您嘗試訪問HttpContext.Current.Request.InputStream屬性時,您可能會遇到如下異常,由於InputStream屬性會嘗試讓您處理Classic流,由於它們都不兼容。您可能還會看到HttpContext.Current.Request.Form參數的另外一個反作用變爲空。web

「 在調用HttpRequest.GetBufferlessInputStream以後,不支持此方法或屬性。」less

1.在同一個WCF項目中添加一個簡單的HttpModule,它將在WCF讀取它以前訪問每一個請求的InputStream屬性,以便它將強制HttpContext.Request.ReadEntityBody爲「Classic」並確保兼容性。spa

namespace SKWcfService
{
    public class WcfReadEntityBodyModeWorkaroundModule : IHttpModule
    {
        public void Dispose()
        {

        }

        public void Init(HttpApplication context)
        {
            context.BeginRequest += context_BeginRequest;
        }
        public void context_BeginRequest(object sender, EventArgs e)
        {
            //這將強制HttpContext.Request.ReadEntityBody爲「Classic」並確保兼容性。
            Stream stream = (sender as HttpApplication).Request.InputStream;
        }
    }
}

2..net

在<configuration> <modules>設置中添加如下行,在web.config中註冊此模塊。調試

 

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true" >
    <add name ="WcfReadEntityBodyModeWorkaroundModule" type="SKWcfService.WcfReadEntityBodyModeWorkaroundModule"/>
      </modules>
    <!--
        若要在調試過程當中瀏覽 Web 應用程序根目錄,請將下面的值設置爲 True。
        在部署以前將該值設置爲 False 可避免泄露 Web 應用程序文件夾信息。
      -->
    <directoryBrowse enabled="true" />
  </system.webServer>

若是您的項目沒法修改,那麼您能夠在單獨的程序集中編寫此Http模塊,單獨GAC,並在web.config中註冊此模塊。code

如今嘗試訪問它應該成功的服務!orm

相關文章
相關標籤/搜索