2

現在、TFS 2010で動作するいくつかのサービス(WCF)を開発しています。

それらの中には、イベントサブスクリプションツールを使用するものもあれば、SharePointポータルや小さなwpfアプリケーションなどを介して使用されるものもあります。

サーバーにIISリセット要求を送信するなど、別のサーバーでいくつかのものを管理するアプリケーションに取り組んでいます。wsDualHttpBindingを使用しているので、コールバックを介して、すべてが発生したときに進行状況をユーザーにメッセージで送信できます。

ただし、OpenTimeoutが何であっても、チャネルを開こうとするとタイムアウト例外が発生するため、サービスでメソッドを呼び出すことさえできません。

これは私の設定です(クライアント側)

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.net>
        <connectionManagement>
            <add maxconnection="200"   address="*"  />
        </connectionManagement>
    </system.net>
    <system.serviceModel>
        <bindings>
            <wsDualHttpBinding>
                <binding name="WSDualHttpBinding_IReset" closeTimeout="00:01:00"
                    openTimeout="00:02:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <reliableSession ordered="true" inactivityTimeout="00:10:00" />
                    <security mode="None">
                        <message clientCredentialType="Windows" negotiateServiceCredential="true" />
                    </security>
                </binding>
            </wsDualHttpBinding>
            <wsHttpBinding>
                <binding name="WSHttpBinding_IDeploy" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferPoolSize="1524288" maxReceivedMessageSize="1279748152"
                    messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                    allowCookies="false">
                    <readerQuotas maxDepth="32" maxStringContentLength="81925" maxArrayLength="163848"
                        maxBytesPerRead="9192" maxNameTableCharCount="16384" />
                    <reliableSession ordered="true" inactivityTimeout="00:10:00"
                        enabled="false" />
                    <security mode="None">
                        <transport clientCredentialType="Windows" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="Windows" negotiateServiceCredential="true" />
                    </security>
                </binding>
            </wsHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://tfsserver:8080/TFSFacade/DeployFacade.svc"
                binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IDeploy"
                contract="DeployFacade.IDeploy" name="WSHttpBinding_IDeploy" />
            <endpoint address="http://tfsserver:8080/DeployService/ResetService.svc"
                binding="wsDualHttpBinding" bindingConfiguration="WSDualHttpBinding_IReset"
                contract="ResetService.IReset" name="WSDualHttpBinding_IReset" />
        </client>
    </system.serviceModel>
    <appSettings>
        <add key="CopiaLocalRollback" value="true"/>
        <add key="CopiaLocalPublish" value="true"/>
        <add key="ModoDiagnostico" value="false" />
        <add key="TempoTimeout" value="300000" />
    </appSettings>
</configuration>

サーバ側:

<?xml version="1.0"?>
<configuration>
    <system.web>
        <compilation debug="true" targetFramework="4.0" />
    </system.web>
    <system.serviceModel>
        <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true">
            <baseAddressPrefixFilters>
                <add prefix="http://tfsserver:8080"/>
                <add prefix="http://tfsservices:8080"/>
                <add prefix="http://tfsservices:1001"/>
            </baseAddressPrefixFilters>
        </serviceHostingEnvironment>
        <bindings>
            <wsDualHttpBinding>
                <binding name="WSDualHttpBinding_ResetService" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <reliableSession ordered="true" inactivityTimeout="00:10:00" />
                    <security mode="None">
                        <message clientCredentialType="Windows" negotiateServiceCredential="true" />
                    </security>
                </binding>
            </wsDualHttpBinding>
        </bindings>
        <behaviors>
            <serviceBehaviors>
                <behavior name="EventServiceBehavior">
                    <serviceMetadata httpGetEnabled="true" />
                    <serviceDebug includeExceptionDetailInFaults="true" />
                </behavior>
                <behavior name="">
                    <serviceMetadata httpGetEnabled="true" />
                    <serviceDebug includeExceptionDetailInFaults="false" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <services>
            <service behaviorConfiguration="EventServiceBehavior" name="DeployService.ResetService">
                <endpoint address="" binding="wsDualHttpBinding" bindingConfiguration="WSDualHttpBinding_ResetService"
                  contract="DeployService.Contracts.IReset" />
            </service>
        </services>
    </system.serviceModel>
    <system.webServer>
        <modules runAllManagedModulesForAllRequests="true"/>
    </system.webServer>
</configuration>

契約:

[ServiceContract(SessionMode = SessionMode.Required,
             CallbackContract = typeof(IResetCallback))]
public interface IReset
{
    [OperationContract]
    void ExecutarIISReset();
}

[ServiceContract]
public interface IResetCallback
{
    [OperationContract(IsOneWay = true)]
    void PumpMessage(string message);

    [OperationContract(IsOneWay = true)]
    void PumpResponsiveMessage(ResponsiveMessage message);

    [OperationContract(IsOneWay = true)]
    void PumpLogDeployBEMessage(LogDeployBE message);

    bool Confirmar();

    ServidorModel[] GetServidores();
}

サービス(問題が発生する前に問題が発生するため、コードを投稿しません):

[AspNetCompatibilityRequirementsAttribute(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)] 
public class ResetService : IReset
{
    //Stuff here
}

フィドラーでは、これをクライアント側で取得します。

7 202 HTTP tfsserver:8080 /DeployService/ResetService.svc 0 private resetman.vshost:9000

202を数回取得すると、時間が経過してタイムアウトが発生します

サーバーでフィドルを実行していると、まったく何も得られません。

何が起こっているのでしょうか?

編集:奇妙な、ローカルホストは動作します。wsDualHttpBindingには特別な権限などが必要ですか?「インターネット」で何も見つかりませんでした

4

3 に答える 3

1

使用しているためwsDualHttpBinding、サーバークライアントの両方が構成で指定されたポートに到達できる必要があります。これが、ポートの問題がないため、ローカル マシンで動作する理由です。タイムアウトは、ファイアウォールがブロックされているか、サーバーがクライアントに戻ることができないことと一致しています。

ファイアウォールまたはポート フォワーディング ルールを追加することでクライアントに簡単に到達できる場合は、wsDualHttpBindingそれでも適している可能性があります。それ以外の場合は、wsDualHttpBinding の使用はおそらく理想的ではありません。この場合、コールバック経由でメッセージを受信する代わりに、クライアントにメッセージをポーリングさせる必要があるかもしれません (つまり、クライアントはメッセージをコールバック経由でプッシュする代わりにプルします)。

詳細については、この投稿を参照してください。そしてこれも。

于 2012-01-16T15:03:30.267 に答える
0

試す

  • ConcurrencyMode = ConcurrencyMode.Reentrant
  • InstanceContextMode = InstanceContextMode.Single
  • 削除するSessionMode.Required

あなたのサービス行動について

于 2012-01-16T13:39:10.713 に答える