2

この問題を解決するために考えられること、または見つけられることをすべて試して、一日中検索して無駄にしました。最初の WCF サービスを構築し、IIS でホストするのはクールだと思いました。長く続くサービスなので仕方ないですね。それ以来、WCF サービスをホストする別のプロジェクトをソリューションに追加し、WCF プロジェクトを参照しましたが、コードからホストしようとして絶え間なく苦労しています。ホストの実装に関するガイダンスについては、主にhttp://msdn.microsoft.com/en-us/library/ms733069.aspxに従いましたが、特定の状況に合わせて微調整しました。

現在の課題は、ホスティング プロジェクトの App.config で定義されているサービス エンドポイントを取得することです。「エンドポイント」の「コントラクト」属性を WCF サービス コントラクトに解決できません。

WCF アセンブリ

namespace WcfFoldingService
{
    [ServiceContract(SessionMode=SessionMode.Required, CallbackContract=typeof(IFoldingUpdaterClientContract))]
    public interface IFoldingUpdaterServiceBehavior
    {
        [OperationContract(IsOneWay = false, IsInitiating = true)]
        void Subscribe();
        [OperationContract(IsOneWay = false, IsTerminating = true)]
        void Unsubscribe();
        [OperationContract(IsOneWay = true)]
        void PublishSomeOperation();
    }
    public interface IFoldingUpdaterClientContract
    {
        [OperationContract(IsOneWay = true)]
        void SomeOperation();
    }
    [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession, ConcurrencyMode=ConcurrencyMode.Single)]
    public class FoldingUpdaterService : IFoldingUpdaterServiceBehavior
    {
        // Omitted for brevity, but complete implementation exists.
    }
}

/WCF アセンブリ

ホスティング アセンブリ

App.config
<system.serviceModel>
<services>
  <service name="WcfFoldingService.FoldingUpdaterService" behaviorConfiguration="httpServiceBehavior">
    <endpoint address="" binding="wsDualHttpBinding" bindingConfiguration="ServiceBindingConfiguration" contract="WcfFoldingService.IFoldingUpdaterServiceBehavior"/>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>
</services>
<protocolMapping>
  <add scheme="http" binding="wsDualHttpBinding" bindingConfiguration="ServiceBindingConfiguration"/>
</protocolMapping>
<bindings>
  <wsDualHttpBinding>
    <binding name="ServiceBindingConfiguration">
      <reliableSession ordered="true"/>
      <security mode="None"/>
    </binding>
  </wsDualHttpBinding>
</bindings>
<behaviors>
  <serviceBehaviors>
    <behavior name="httpServiceBehavior">
      <serviceMetadata httpGetEnabled="True"/>
      <serviceDebug includeExceptionDetailInFaults="False"/>
      <serviceThrottling maxConcurrentCalls="1000" maxConcurrentInstances="100" maxConcurrentSessions="100"/>
      <sendMessageChannelCache allowUnsafeCaching="false"/>
    </behavior>
  </serviceBehaviors>
</behaviors>
</system.serviceModel>

/ホスティング アセンブリ

Message:
The 'contract' attribute is invalid - The value 'WcfFoldingService.IFoldingUpdaterServiceBehavior' is invalid according to its datatype 'serviceContractType' - The Enumeration constraint failed.

私は困惑しています。Google は関連するリンクをほとんど提供しておらず、ほとんどの場合、私が経験していない他の構成の問題に関係しています。WCF アセンブリが参照されています。私は完全修飾名を使用しています。何らかの形で名前空間の競合が発生した場合に備えて、ConfigurationName 属性を使用してみました。私はWCFが初めてなので、これが明らかな問題であることを願っています!

編集: App.config XML ではなく、プログラムによる構成を使用しています。最も重要なステートメントはContractDescription.GetContract(serviceType)new ContractDescription("FullNamespace.IContract")XML 構成とまったく同じように失敗したことです。serviceType の FullName プロパティの Type オブジェクトは、私の「FullNamespace.IContract」とまったく同じです。コード内でアセンブリへのハード参照がないとアセンブリが読み込まれないという問題があると思われますが、現時点では確信が持てません。今のところ、このアプローチは問題なく機能します。

using (var host = new ServiceHost(typeof(FoldingUpdaterService), baseAddress))
{
    var serviceType = typeof (IFoldingUpdaterServiceBehavior);
    var serviceContract = ContractDescription.GetContract(serviceType);
    var foldingEndpoint = new ServiceEndpoint(serviceContract)
        {
            Binding = new WSDualHttpBinding()
            Address = new EndpointAddress(new Properties.Settings().WcfUpdaterServiceAddress)
        };
    host.Description.Endpoints.Add(foldingEndpoint);
    [...]
4

5 に答える 5

3

これは古い質問ですが、誰かが同じ問題を抱えている場合は、これでうまくいきました。Visual Studio を閉じて、ソリューション ファイル (.sln) と同じディレクトリにある .suo ファイルを削除してみてください。これにより、エディターのキャッシュがリセットされます。サービス コントラクト ファイルを別のアセンブリに移動し、キャッシュがまだ古い場所を参照していた後も、同じ問題が発生しました。

于 2015-03-29T16:33:10.970 に答える
1

セルフホスティング アプリケーションには、<host>タグ内に<service>タグが必要です。

<system.serviceModel>
<services>
  <service name="WcfFoldingService.FoldingUpdaterService" behaviorConfiguration="httpServiceBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8080/Services/"/>
          </baseAddresses>
        </host>
    <endpoint address="" binding="wsDualHttpBinding" bindingConfiguration="ServiceBindingConfiguration" contract="WcfFoldingService.IFoldingUpdaterServiceBehavior"/>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>
</services>
于 2013-04-07T16:20:49.457 に答える
0

これがまだあなたにとって問題かどうかはわかりませんが、最近同じ問題に出くわしました。

サービス名を指定するときは、名前空間も使用する必要があります。したがって、名前空間がmyhost正しいエントリであるとしましょう...

<service name="myhost.WcfFoldingService.FoldingUpdaterService"...>

契約についても同様です。

于 2013-08-20T07:26:01.013 に答える