13

VS 2012 をインストールし、いくつかの Web プロジェクトで正常に使用していますが、VS 2012 の何かが原因で Web サービス プロジェクトが壊れてしまいました。私はまだ Web サービス プロジェクトで VS 2010 を使用しており、2012 年にはまだ開いていません。

参照されているブログ プロジェクトでクラスのインスタンスを作成しようとすると、次のエラーがスローされます。

このメソッドまたはプロパティは、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



**編集- ボーナス質問

これらの Framework 4.5 プロパティが 4.0 ソリューションに影響するのはなぜですか?

4

1 に答える 1

29

注:この問題は.net4.5.1で修正されています。4.5.1で修正を確認できます。.net 4.5.1を入手したら、次のappSettingを追加して、以前の動作に戻します。

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

HttpModuleを作成してReadEntityBodyModeを「クラシック」にする方法は次のとおりです。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

他の質問に答えるには(これらのFramework 4.5プロパティが私の4.0ソリューションに影響を与えるのはなぜですか?):.net4.5は.net4.0のインプレースアップグレードです。したがって、プロジェクトが4.0をターゲットにしている場合でも、VS 2012は4.5ランタイムをインストールするため、4.5の動作の一部が有効になります。

編集

ブログの記事:

.net 4.5では、WCFはスケーラビリティの利点のためにバッファレス入力ストリームを活用しました。その結果、HttpContext.Current.Request.InputStreamプロパティにアクセスしようとすると、以下の例外が発生する可能性があります。これは、InputStreamプロパティが両方とも互換性がないため、Classicストリームを処理しようとするためです。

「このメソッドまたはプロパティは、 HttpRequest.GetBufferlessInputStreamが呼び出された後はサポートされません。」</ p>

完全に機能するWCF4.0アプリがあるが、.netフレームワークを4.5にアップグレードすると、サービスがこのプロパティへのアクセスに失敗することに気付いた場合、問題を回避する方法は次のとおりです。

  • 同じWCFプロジェクトに単純なHttpModuleを追加します。これは、WCFが要求を読み取る前に各要求のInputStreamプロパティにアクセスするため、HttpContext.Request.ReadEntityBodyが「クラシック」になり、互換性が確保されます。

    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;    
        }    
     } 
    
  • これらの行を設定に追加して、このモジュールをweb.configに登録します<configuration> <modules>

    <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に登録できます。

今すぐサービスにアクセスしてみてください。成功するはずです。

于 2012-09-14T00:25:21.903 に答える