最初のセルフホストWCFサービスを作成しました。私はそれをC#コンソールアプリでホストしましたが、エラーがスローされます:
System.ServiceModel.AddressAccessDeniedException:HTTPがURL httpを登録できませんでした:8080
管理者としてVisual Studio 2013を実行すると、うまく動作しますが、そうでない場合は動作しません。 VSをADMINとして起動する代わりに、自動的に実行する方法はありますか?
これまで、HelloService
クラスライブラリを作成し、そこにインターフェイスIHelloService
とHelloService
で構成されるWCFサービスを追加しました。
IHelloService
:
namespace HelloService
{
[ServiceContract]
public interface IHelloService
{
[OperationContract]
String GetMsg();
}
}
HelloService
:
namespace HelloService
{
public class HelloService : IHelloService
{
public String GetMsg()
{
return "Service Accessed";
}
}
}
次に、app.config
ファイルを持つC#コンソールアプリHelloServiceHost
を作成しました。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors >
<behavior name="MexBehaviour">
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service name="HelloService.HelloService"
behaviorConfiguration="MexBehaviour" >
<endpoint
address="HelloService"
binding="basicHttpBinding"
contract="HelloService.IHelloService"></endpoint>
<endpoint
address="HelloService"
binding="netTcpBinding"
contract="HelloService.IHelloService"></endpoint>
<endpoint
address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange"></endpoint>
<Host>
<baseAddresses>
<add baseAddress="http://localhost:8080/"/>
<add baseAddress="net.tcp://localhost:8081/"/>
</baseAddresses>
</Host>
</service>
</services>
</system.serviceModel>
</configuration>
およびprogram.csファイル:
using HelloService;
using System.ServiceModel;
namespace HelloServiceHost
{
class Program
{
static void Main(string[] args)
{
using(ServiceHost sh = new ServiceHost(typeof(HelloService.HelloService)))
{
sh.Open();
Console.WriteLine("Host Started @"+ System.DateTime.UtcNow.ToShortDateString());
sh.Close();
}
}
}
}
ビデオチュートリアルに正確に従いましたが、なぜ機能しないのですか?
VS 2013、.net 4を使用しています
管理者としてcmdを起動し、次を入力します。
netsh http add urlacl url = http:// +:8080/MyUri user = DOMAIN\user
これは私のために働いた。
別のプロジェクトで同じ問題に遭遇しました。
問題は、TCPポートへのバインドには管理者特権が必要なことです。これに対処するには、いくつかの方法があります。
管理コマンドプロンプトを開いたままにします。その後、コンソールアプリを直接実行できます。
(提案どおり)VSを管理者として実行します。これは、アプリをデバッグする場合にのみ絶対に必要です。
RequestedExecutionLevel level = "requireAdministrator"を指定して、アプリケーションマニフェストファイルを作成します。 。NETアプリケーションを管理者として強制的に実行するにはどうすればよいですか? を参照してください。
ルートパスURL( http:// +:8080 / )権限が必要な場合:
netsh http add urlacl url=http://+:8080/ user=%USERDOMAIN%\%USERNAME%
すべてのURL予約を表示:
netsh http show urlacl | FIND "URL"
Windowsサービスでサービスを開始中にこのエラーが発生した場合、プロセスインストーラーでアカウントを確認できます。
[RunInstaller(true)]
public class ProjectInstaller : Installer
{
private ServiceProcessInstaller process;
private ServiceInstaller service;
public ProjectInstaller()
{
process = new ServiceProcessInstaller();
process.Account = ServiceAccount.LocalSystem;
service = new ServiceInstaller();
service.ServiceName = "WCFWindowsServiceSample";
Installers.Add(process);
Installers.Add(service);
}
}