0

そのため、マネージド Windows サービスでホストされている WCF サービスに関していくつかの問題があります。

基本的に私がやったことは次のとおりです。

このような簡単なテストを使用して、WCF サービス ライブラリ (WCF サービス テンプレート) を作成しました。

[ServiceContract]
public interface IExample
{
    [OperationContract]
    string HelloWorld();
}

public class Example : IExample
{
    public string HelloWorld()
    {
        return "HelloWorld";
    }
}

これに対応するapp.configも作成しました

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    </startup>
    <system.serviceModel>
        <behaviors>
            <serviceBehaviors>
                <behavior name="ServiceBehavior">
                    <serviceMetadata httpGetEnabled="true"/>
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <services>
            <!-- This section is optional with the new configuration model introduced in .NET Framework 4. -->
            <service name="Peripherie.WCFService" behaviorConfiguration="ServiceBehavior">
                <host>
                    <baseAddresses>
                        <add baseAddress="http://localhost:8067/PeripherieService"/>
                    </baseAddresses>
                </host>
                <endpoint address="" binding="wsHttpBinding" contract="Peripherie.WCFService.Interfaces.IExample" />
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
            </service>
        </services>
    </system.serviceModel>
</configuration>

その後、上記のライブラリとその他の必要なライブラリを参照する Win サービス プロジェクトを (これも Win サービス テンプレートを使用して) 追加しました。

Service クラスでは、サービスホストを作成するための基本的なことを行います

public partial class Service : ServiceBase
{
    public ServiceHost serviceHost = null;

    public Service()
    {
       InitializeComponent();
    }

   protected override void OnStart(string[] args)
   {
       if(serviceHost!=null)
        serviceHost.Close();

       serviceHost = new ServiceHost(typeof(Service));

       serviceHost.Open();
   }

   protected override void OnStop()
   {
       if(serviceHost!=null)
       {
        serviceHost.Close();
        serviceHost = null;
       }
   }
}

また、サービスに必要なインストーラーを追加し、アカウントを localSystem に設定しました。

プロジェクト全体が問題なくコンパイルされ、(installutil アプローチを使用して) サービスをインストールして開始することもできます。ただし、ブラウザーでサービスを開こうとすると、サイドを読み込めないというエラーが表示されます。また、取得するメタデータがないことが示されるため、WCF テスト クライアントを使用することもできません。

すべてが正しくセットアップされているように見えるため、全体の思考が機能しない理由がよくわかりません。

だから、どんなアドバイスでもいいです。

編集:

SouthShoreAK によって指摘された間違いを修正した後、構成に次のようなエラーも見つかりました。

<service name="Peripherie.WCFService" behaviorConfiguration="ServiceBehavior">

これである必要があります:

<service name="Peripherie.WCFService.Services.Example" behaviorConfiguration="ServiceBehavior">

今、URLを登録できませんでしたというエラーが表示されます。

System.ServiceModel.AddressAccessDeniedException: HTTP konnte URL "http://+:8067/PeripherieService/" nicht registrieren. Der Prozess weist keine Zugriffsrechte für diesen Namespace auf 

ここで説明されているツールを既に試しましたが、エラーは解決しませんでした。エラーのため、引き続きサービスを開始できます。

編集:

その問題も解決されました。サービス プロセス インストーラーはまだ networkService に設定されています。ローカルシステムに設定した後、サービスを開始できます。

しかし、IE経由でURLを呼び出すと、エラー400が発生します。

最終編集:

さて、これで動作します。最後のエラーは、ベース アドレスの末尾に / がないことが原因でした。だからそうすべきだった

<add baseAddress="http://localhost:8067/PeripherieService/"/>

そして、SouthShoreAK は私の設定で犯した間違いをかなり指摘してくれたので、彼の答えを受け入れます。

4

1 に答える 1

1

コントラクトは IMain ではなく IExample にする必要があります

 <endpoint name="ServiceHttpEndpoint" address="http://localhost:8067/PeripherieService" binding="wsHttpBinding" contract="Peripherie.WCFService.Interfaces.IMain" />

次のように変更する必要があります。

 <endpoint name="ServiceHttpEndpoint" address="http://localhost:8067/PeripherieService" binding="wsHttpBinding" contract="Peripherie.WCFService.Interfaces.IExample" />

また、これ:

serviceHost = new ServiceHost(typeof(Service));

これでなければなりません:

serviceHost = new ServiceHost(typeof(Example));

サービス ホストに Windows サービスのインスタンスを登録しようとしています。WCF サービスを登録する必要があります。

サービス ホストでエラーが発生した場合でも、Windows サービスが起動して実行されることがあります。Windows イベント ログ ([スタート] メニューに「イベント ビューア」と入力) をチェックして、問題が発生していないかどうかを確認してください。

于 2013-10-03T19:29:35.910 に答える