2009-07-30 3 views
1

IIS7でホストされているWCFサービスがあります(サービスとクライアントの構成はこの記事の末尾にあります)。私は奇妙なシナリオを横断して、誰かがそれを攻撃して解決策を見つける方法についていくつかのアイデアを持っていることを期待していました。WCF応答メッセージに40分がかかり、タイムアウト例外がスローされない

このサービスでは、1つの契約「ProcessMessage」のみが公開されています。その契約を使用しているサービスからの同期メッセージは、予想されるパフォーマンスで正常に送受信できますが、その契約の1つのコールでは65KB以上のデータが返されます。約1 MB。最初にそれを呼び出すと、予想される最大受信サイズ超過エラーが発生しました。だから私はmaxReceivedMessageSizeを増やしました、そして、この特定の呼び出しはクライアントに戻るのに40分かかります。これはタイムアウトの設定をはるかに超えており、私が期待する以上のものです。サーバー側の処理時間はわずか2秒です。それはクライアント側で抑えられているようです。

私はまた、ファイル内の他のクォータのいくつかを無駄にすることを試みました。

ご意見は大変ありがとうございます。ありがとう。

サービス設定:

<system.serviceModel> 
<services> 
    <service behaviorConfiguration="Lrs.Esf.Facade.Startup.FacadeBehavior" 
    name="Lrs.Esf.Facade.Startup.FacadeService"> 
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="default" contract="Lrs.Esf.Facade.Startup.IFacadeService"> 
     <identity> 
     <servicePrincipalName value="lrsdomain/PensionDev" /> 
     </identity> 
    </endpoint> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    </service> 
</services> 
<bindings> 
    <wsHttpBinding> 
    <binding name="default"> 
     <security mode="None"/> 
    </binding> 
    </wsHttpBinding> 
</bindings> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="Lrs.Esf.Facade.Startup.FacadeBehavior"> 
     <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
     <serviceMetadata httpGetEnabled="true" /> 
     <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 

    </behavior> 
    </serviceBehaviors> 
</behaviors> 

クライアント設定:あなたは、様々なparameteのサイズを増加させなかった

<system.serviceModel> 
<bindings> 
    <wsHttpBinding> 
    <binding name="WSHttpBinding_IFacadeService" closeTimeout="00:01:00" 
     openTimeout="00:01:00" receiveTimeout="00:1:00" sendTimeout="00:01:00" 
     bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
     maxBufferPoolSize="52428800" maxReceivedMessageSize="6553600" 
     messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" 
     allowCookies="false"> 
     <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" 
      maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 
     <security mode="None">   
     </security> 
    </binding> 
    </wsHttpBinding> 
</bindings> 
<client> 
    <endpoint address="http://esf2.facade.testpe.pg.local/FacadeWcf/FacadeService.svc" 
     binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IFacadeService" 
     contract="FacadeServiceReference.IFacadeService" name="WSHttpBinding_IFacadeService"> 
    <identity> 
     <servicePrincipalName value="lrsdomain/PensionDev" /> 
    </identity> 
    </endpoint> 
</client> 

+0

私はFiddlerとクライアントプロセスの完全なトレースを実行し、より多くの情報を持っています。応答メッセージは数秒でクライアントコンピュータに戻ってきますが、40分後にメッセージログのトレースと「チャネル上のメッセージを受信しました」は記録されません。私の推測では、メッセージをデシリアライズするのに40分かかります。 – Mark

+0

私はIISからサービスホストを取り出し、TCPエンドポイントを作成しました。クライアントPCからの呼び出しは5秒後に戻ります。私の前提は、wsHTTPにバグがあるか、wsHTTPまたはIISの設定が不足していることです。 – Mark

+0

私はWAS/TCPを有効にし、IISホストサービスにTCPエンドポイントを追加しました。 TCP経由での呼び出しには数秒しかかかりませんが、HTTP(basicまたはws)経由での呼び出しには40分かかります。 – Mark

答えて

0

を使用する必要があります問題と回避策の詳細はわかりますが、追加的な洞察は素晴らしいでしょう。

DataSetがWCFによってXML形式でシリアル化されていました。 DataSetをバイト[]でシリアル化し、時間を4秒に短縮しました。 1つの推測では、4MBのXMLのすべての文字をエスケープして、HTTP通信が有効であることが原因で問題が発生したと考えられます。

+1

サービスの契約で.NET固有の型を使用しないもう1つの理由。 –

+0

私はジョンを読んだ。では、データセットをワイヤを介して転送する必要があるときに、どのような提案をしますか。 JSONにシリアル化し、反対側をデシリアライズしますか? – Mark

+0

もう少し調査を行いましたが、返されるデータセットには1行と1列が含まれていましたが、その列の値はそれ自体XMLであり、かなり大きかったです。私は、WCFが関与する前に、列の値を別々にシリアル化してこの問題を回避し、この問題を回避しました。 – Mark

1

サーバー側のrs、それは思われる - あなたは間違いなくそれを試す必要があります!サーバー側のクライアント設定ファイルのバインディング設定も使用してください。サービスはまだ64Kメッセージサイズにデフォルト設定されているため、窒息する可能性があります。

また、あなたのクライアントでreceiveTimeout結合は少し面白いです - それはゼロ桁が欠落しています:

<binding name="WSHttpBinding_IFacadeService" 
receiveTimeout="00:1:00" 

あなたは、私は基本的な原因を考え出したreceiveTimeout="00:01:00"

マルク・

+0

ありがとうMarc。私はこれらの設定がサーバー側に適用されたとは思っていませんでしたが、私はあなたの提案後にそれを試しましたが、結果は変わりませんでした。私もタイムアウトを修正しました。 クライアント側でメッセージサイズに関する元のエラーが発生していたので、私の前提は、サーバー上ではなく、エラーが発生したということです。タイムアウトが起こらないという事実はかなり混乱しています。これは、WCFがクライアント側でメッセージの処理を終了し、クライアントに制御を渡したと考えているのとほぼ同じですが、何らかの理由でまだブロックしています。 – Mark

+0

OK、興味深い - クライアントでタイムアウトやその他のエラーが実際に発生していませんか?それはむしろ奇妙です...... –

+0

サーバーのイベントログにエントリがありますか?たぶん、IISは何かをログに記録しますか?奇妙なことには何もないと思われます.... –

関連する問題