0

Windows サービスとして自己ホストされる、かなり基本的な WCF SOAP Web サービスを構築しようとしています。Windows サービス自体はマシン上で稼働しています。Visual Studio または Web ブラウザーを介してローカルにアクセスすることはできません。

関連する C# コードを以下に示します。MyDummyService契約を実装すると仮定しますIDummyService:

public class Program : ServiceBase
{
    private ServiceHost host = null;
    private readonly Uri baseAddress = new Uri("http://localhost:8000/DummyAPI");

    public static readonly ILog log = LogManager.GetLogger(typeof(Program));
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    public static void Main(string[] args)
    {
        ServiceBase.Run(new Program());
    }

    public Program()
    {
        this.ServiceName = "DummyService";
    }

    protected override void OnStart(string[] args)
    {
        log.Info("Starting service");

        try
        {
            base.OnStart(args);

            host = new ServiceHost(typeof(MyDummyService), baseAddress);

            host.Open();
        }
        catch (Exception ex)
        {
            log.Error(ex.ToString());
        }
        finally
        {
            if (host != null)
                ((IDisposable)host).Dispose();
        }
    }

    protected override void OnStop()
    {
        log.Info("Stopping service");
        base.OnStop();
        host.Close();
    }
}

関連app.config

<system.serviceModel>
    <services>
        <service name="DummyAPI.MyDummyService" 
                 behaviorConfiguration="MyDummyBehavior">
           <endpoint 
               address="" 
               binding="basicHttpBinding" 
               contract="DummyAPI.IDummyService" />
           <endpoint address="mex" binding="mexHttpBinding" 
                     contract="IMetadataExchange" />
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="MyDummyBehavior">
                <serviceMetadata httpGetEnabled="True" policyVersion="Policy15"/>
                <serviceDebug includeExceptionDetailInFaults="True"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>

アクセスすると

http://localhost:8000/DummyAPI

また

http://localhost:8000/DummyAPI/MyDummyService

(またはそれらの後に ?wsdl が続くもの) を Web ブラウザーで実行すると、404 が返されます。

名前web.config空間 (または名前空間のように見えるもの) は、私を少し混乱させます。その場で安全に構成できるものと、C# クラスの名前空間を反映する必要があるものは何ですか?

4

2 に答える 2

5

ServiceHost を実行せずに実質的に残す Start メソッドで ServiceHost を破棄しているようです。

finally
{
    if (host != null)
        ((IDisposable)host).Dispose();
}
于 2013-04-12T21:35:22.033 に答える
0

優れた入門書は、Configuring Services Using Configuration Filesです。

service 要素の name 属性は、サービスを実装する型の完全修飾名である必要があります。

エンドポイント要素の契約属性は、サービスが実装するインターフェイスの完全修飾名である必要があります。

これら 2 つの条件が満たされている場合、ServiceHost はアプリ構成で指定された構成を見つけて適用する必要があります。

WCF を初めて使用する場合は、Visual Studio のツール メニューから利用できる WCF サービス構成エディターを使用すると簡単に開始できます。

于 2013-04-12T20:09:19.083 に答える