3

HTMLサイト(JavaScriptファイル、画像など)も提供する自己ホスト型Webサービス(WebServiceHost)があります。サービスは.net 4.0(vs2010を使用)で正常に動作します。

vs2012 をインストールしましたが、アプリが壊れているようです (まだ vs2010 を使用しています - おそらく .net 4.5 のインストールが原因です)。正常にコンパイルされ、実行時エラーも発生しませんが、状況によっては html と JavaScript が壊れているようです。これが(私が思うに)関連するコードフラグメントです:

使用されたインターフェイス (System.Data.Services):

public interface IRequestHandler
{
    Message ProcessRequestForMessage(Stream messageBody);
}

メッセージの作成:

string filePath = _physicalPath + string.Join("\\", incomingRequest.UriTemplateMatch.RelativePathSegments.ToArray());
HttpResponseMessageProperty responseProperty = new HttpResponseMessageProperty();

if (File.Exists(filePath) && SetContentType(responseProperty.Headers, Path.GetExtension(filePath).ToLower()))
{
    Message message = Message.CreateMessage(MessageVersion.None, "", HttpServiceBodyWriter.Create(filePath));
    message.Properties.Add(WebBodyFormatMessageProperty.Name, new WebBodyFormatMessageProperty(WebContentFormat.Raw));
    message.Properties.Add(HttpResponseMessageProperty.Name, responseProperty);
}

HttpServiceBodyWriter:

class HttpServiceBodyWriter : StreamBodyWriter
{
    private System.IO.Stream _source = null;

    private HttpServiceBodyWriter(System.IO.Stream source) : base(false)
    {
        _source = source;
    }

    protected override void OnWriteBodyContents(System.IO.Stream stream)
    {
        _source.CopyTo(stream);
    }

    internal static HttpServiceBodyWriter Create(System.Net.WebResponse response)
    {
        return new HttpServiceBodyWriter(response.GetResponseStream());
    }

    internal static HttpServiceBodyWriter Create(string filePath)
    {
        return new HttpServiceBodyWriter(File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite));
    }
}

HTML ページをリクエストすると、破損したページが表示されることがあります (二重の dtd 定義と「head」の後の空のタグを参照してください)。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <>
    .....

正しいページが配信される場合があります。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta charset="UTF-8" />
....

最初のページ リクエストでは常に正しいページが配信されるようです。後続のリクエストが破損します。

この奇妙な動作について誰か説明がありますか? 助けていただければ幸いです(この問題はC ++の時代を思い出させます)。

これは、App.Config の serviceModel セクションです。

<system.serviceModel>
  <diagnostics>
    <messageLogging logEntireMessage="true" logMalformedMessages="true" logMessagesAtServiceLevel="false" logMessagesAtTransportLevel="true" maxMessagesToLog="300000" maxSizeOfMessageToLog="200000" />
  </diagnostics>
  <services>
    <service name="WcfTest.HttpService" behaviorConfiguration="DataServiceBehavior">
      <endpoint name="DataService" binding="webHttpBinding" bindingConfiguration="DataService" contract="System.Data.Services.IRequestHandler" />
      <host>
        <baseAddresses>
          <add baseAddress="http://localhost:8080/TestSite/" />
        </baseAddresses>
      </host>
    </service>
  </services>
  <behaviors>
    <endpointBehaviors />
    <serviceBehaviors>
      <behavior name="DataServiceBehavior">
        <serviceDebug includeExceptionDetailInFaults="False" />
        <dataContractSerializer maxItemsInObjectGraph="1000000" />
        <serviceMetadata httpGetEnabled="true" />
        <serviceThrottling maxConcurrentCalls="200" maxConcurrentInstances="2147483647" maxConcurrentSessions="200" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <bindings>
    <webHttpBinding>
      <binding name="DataService" maxReceivedMessageSize="5000000" maxBufferPoolSize="5000000" maxBufferSize="5000000" closeTimeout="00:03:00" openTimeout="00:03:00" receiveTimeout="00:10:00" sendTimeout="00:03:00">
        <readerQuotas maxStringContentLength="5000000" maxArrayLength="5000000" maxBytesPerRead="5000000" />
        <security mode="None"/>
      </binding>
    </webHttpBinding>
  </bindings>
</system.serviceModel>

アップデート

この問題を再現できる小さなプロジェクトを作成しました。ここからダウンロードできます: https://skydrive.live.com/redir?resid=CBC3C885DE2032B8!131&authkey=!ALZOaSL0V0s-itM

破損した html が表示されるまで、ブラウザの更新ボタンを数回押すだけです。

4

2 に答える 2

1

これは、メッセージ ログの有効化に関する webHttpBinding + 4.5 の既知の問題です。http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/2bc5e5a6-1971-46cb-8b4f-f1c46130facaと同じです。この問題は、サービスでメッセージ ログが有効になっている場合に発生します。この問題の修正が利用可能になるまで、構成からこれらの行をコメントアウトして、アプリの構成ファイルでメッセージのログ記録を無効にしてください。メッセージ ログを無効にしても、アプリケーションが正常に動作することを確認しました。お役に立てれば!

<!--
<messageLogging logEntireMessage="true" logMalformedMessages="true" logMessagesAtServiceLevel="false" logMessagesAtTransportLevel="true"
maxMessagesToLog="300000" maxSizeOfMessageToLog="200000" />-->
于 2012-11-16T20:37:40.320 に答える
0

私たちは同じ問題に直面しました。設定logMessagesAtTransportLevelfalseの設定または設定の削除が役立ちました。

于 2012-11-28T13:30:15.817 に答える