1

サービスの起動時に行う 1 回限りの初期化タスクがいくつかあります。これを行うために、InitializeRuntime をオーバーライドするカスタム ServiceHostFactory と ServiceHost を定義しました。

Service1.svc マークアップ:

<%@ ServiceHost Language="C#" Debug="true" Factory="service.Our_Service_Host_Factory" Service="service.Service1" CodeBehind="Service1.svc.cs" %>

サービス ホストの定義:

public class Our_Service_Host_Factory : ServiceHostFactory
{
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {
        return new Our_Service_Host(serviceType, baseAddresses);
    }
}

class Our_Service_Host : ServiceHost
{
    public Our_Service_Host(Type serviceType, Uri[] baseAddresses)
        : base(serviceType, baseAddresses) { }

    protected override void InitializeRuntime()
    {
         // one time setup code
    }
}

web.config からのスニペット:

<system.serviceModel>
  <behaviors>
    <serviceBehaviors>
      <behavior>
        <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
        <serviceDebug includeExceptionDetailInFaults="false"/>
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <protocolMapping>
    <add binding="basicHttpsBinding" scheme="https" />
  </protocolMapping>    
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>

ServiceHost マークアップの Factory 属性を削除すると、WCF テスト クライアントはサービスに正常に接続できます。元に戻すと、次のエラーでメタデータ エンドポイントが見つかりません。

Error: Cannot obtain Metadata from http://localhost:50154/Service1.svc If this is a Windows (R)
Communication Foundation service to which you have access, please check that you have enabled 
metadata publishing at the specified address.  For help enabling metadata publishing, please 
refer to the MSDN documentation at http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata 
Exchange Error    URI: http://localhost:50154/Service1.svc    Metadata contains a reference that 
cannot be resolved: 'http://localhost:50154/Service1.svc'.    There was no endpoint listening at 
http://localhost:50154/Service1.svc that could accept the message. This is often caused by an 
incorrect address or SOAP action. See InnerException, if present, for more details.    The 
remote server returned an error: (404) Not Found.HTTP GET Error    URI: 
http://localhost:50154/Service1.svc    There was an error 
downloading 'http://localhost:50154/Service1.svc'.    The request failed with HTTP status 404: 
Not Found.

カスタムの ServiceHost/ServiceHostFactory を使用すると、単純化された構成が壊れる可能性があるようです。これは事実ですか、それともこれを機能させ続けるために私が見落としているものがありますか?

4

1 に答える 1

3

InitializeRuntime() をオーバーライドする場合は、必ず base.InitializeRuntime() を呼び出してください。そうしないと、この動作が発生する可能性があります。追加のスタートアップ ロジックを呼び出す前に base.InitializeRuntime() を呼び出した後、サービスが正しくルーティングされるようになりました。

于 2013-04-20T00:17:59.720 に答える