0

セキュリティで保護されていないエンドポイントを自己ホスト型サービスに追加しようとしていたため、基本的に、セッションを使用するインターフェイスとセッションを使用しないインターフェイスが 1 つあります。どちらも同じクラスで実装されています。これが私のサーバー構成ファイルの一部です:

<service name="PT.DataServices.WCFService.PTDataServices" behaviorConfiguration="dataServiceBehavior">
    <endpoint address="PTDataServices" binding="wsHttpBinding" contract="PT.DataServices.WCFService.IPTDataServices" bindingConfiguration="wsHttpBinding1">
      <identity>
        <dns value="localhost"/>
      </identity>
    </endpoint>

    <endpoint address="PTDataServicesNoSessions" binding="wsHttpBinding" contract="PT.DataServices.WCFService.IPTDataServicesNoSessions" bindingConfiguration="wsHttpBinding2">
      <identity>
        <dns value="localhost"/>
      </identity>
    </endpoint>


    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>

    <host>
      <baseAddresses>
        <add baseAddress="http://*/PT6/DataServices/"/>
      </baseAddresses>
    </host>
  </service>

セッションなしのインターフェース:

[ServiceContract(
    SessionMode = SessionMode.NotAllowed
)]
public interface IPTDataServicesNoSessions
{
    [OperationContract]
    string GetData(int value);

}

セッションとのインターフェース:

[ServiceContract(
    SessionMode=SessionMode.Required
)]
public interface IPTDataServices
{
    [OperationContract(IsInitiating = true, IsTerminating = false)]
    DcUser InitSession(string userCode, string passwordEncrypted, string connectionString);

    [OperationContract(IsInitiating = false, IsTerminating = true)]
    int EndSession();

    [OperationContract(IsInitiating = false, IsTerminating = false)]
    string GetData(int value);
}

ブラウザに :http://localhost/PT6/DataServices/ を入力すると、以下が返されます。

PT.DataServices.WCFService.IPTDataServicesNoSessions.GetData 操作は、PT.DataServices.WCFService.IPTDataServices.GetData 操作から既にエクスポートされているメッセージ要素 [http://tempuri.org/:GetData] を参照します。

動的に使用されているエンドポイントに応じて、すべてのクライアントが異なるメソッド名を使用するように変更したくありません... 2 つのインターフェイスのそれぞれに同じメソッドを使用しても問題ないことを WCF に伝えるにはどうすればよいですか?

4

1 に答える 1

1

自分で考え出した。インターフェイスに名前空間属性を追加する必要がありました。

[ServiceContract(
    SessionMode=SessionMode.Required,
    Namespace = "PTDataServices/WithSession"
)]

[ServiceContract(
    SessionMode = SessionMode.NotAllowed,
    Namespace = "PTDataServices/NoSessions"
)]

これにより、WCFは、両方のインターフェイスで同じ名前を持つメソッドのWSDLでのメソッド名の衝突を回避できました。

于 2012-08-20T14:01:41.670 に答える