そのため、マネージド 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 は私の設定で犯した間違いをかなり指摘してくれたので、彼の答えを受け入れます。