0

私の本では、WsHttpBindingとNetTCPBindingの2つのバインディングを使用して、2つのエンドポイントを公開し、ホストアプリケーションでサービスをホストする必要があります。

C#で次のコードを使用して、サービスに接続しようとしています。

Uri BaseAddress = new Uri("http://localhost:5640/SService.svc");

Host = new ServiceHost(typeof(SServiceClient), BaseAddress);
ServiceMetadataBehavior Behaviour = new ServiceMetadataBehavior();
Behaviour.HttpGetEnabled = true;
Behaviour.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
Host.Description.Behaviors.Add(Behaviour);
Host.Open();

サービス側では:

[ServiceContract]
public interface IService...

public class SService : IService....

次に、構成ファイルに次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.serviceModel>

    <behaviors>
      <serviceBehaviors>
        <behavior name="Behavior">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="False"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>

    <services>
      <service behaviorConfiguration="WsHttpBehaviour" name="SService.SService">

        <endpoint
          address=""
          binding="wsHttpBinding"
          bindingConfiguration="WsHttpBindingConfig"
          contract="SService.IService" />

        <endpoint
          address=""
          binding="netTcpBinding"
          bindingConfiguration="NetTCPBindingConfig"
          contract="SService.IService" />

        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:5640/SService.svc" />
            <add baseAddress="net.tcp://localhost:5641/SService.svc" />
          </baseAddresses>
        </host>

      </service>
    </services>

  </system.serviceModel>
</configuration>

しかし、ホストアプリケーションにサービス参照を追加しようとすると、アドレスからメタデータをダウンロードできないと表示されます。私は何が悪いのか理解できず、先生はこれを教えたことはありませんでした。私は先に進んでそれを調べ、前もって学ぶことにしました。エディターを使用して、上記のWebConfigを作成しました。

誰かが私を正しい方向に向けることができますか?エディターを使用してメタデータの動作を追加し、HttpGetEnabledをtrueに設定しました。

4

1 に答える 1

1

この問題を引き起こす可能性のあるコードの問題をいくつか見つけることができます。

Host = new ServiceHost(typeof(SServiceClient), BaseAddress)typeof(SService.SService)の代わりにここを渡しますtypeof(SServiceClient)。このように変更します。

Host = new ServiceHost(typeof(SService.SService))

<service behaviorConfiguration="WsHttpBehaviour"。あなたがそれを定義したように、これは「振る舞い」であるべきだと思います。構成でメタデータを有効にしているため、ServiceMetadataBehaviorをサービスホストに追加するコード行を削除できます。

参照用に使用できるサンプルは次のとおりです。

<system.serviceModel>
    <services>
      <service name="ConsoleApplication1.Service">
        <endpoint address="" binding="wsHttpBinding" contract="ConsoleApplication1.IService" />
        <endpoint address="" binding="netTcpBinding" contract="ConsoleApplication1.IService" />
        <host>
          <baseAddresses>
            <add baseAddress="http://<machinename>:5640/SService.svc" />
            <add baseAddress="net.tcp://<machinename>:5641/SService.svc" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="False"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            ServiceHost host = new ServiceHost(typeof(Service));
            host.Open();

            Console.ReadLine();
        }
    }

    [ServiceContract]
    public interface IService
    {
        [OperationContract]
        string DoWork();
    }

    public class Service : IService
    {
        public string DoWork()
        {
            return "Hello world";
        }
    }
}

メタデータは、構成で定義されたhttpベースアドレスで自動的に利用可能になります。

于 2013-02-21T04:28:30.193 に答える