我正在学习WCF,并遵循构建简单MathService的教科书。它应该作为Windows服务托管。托管部分在app.config中配置:
<system.serviceModel>
<services>
<service name = "MathServiceLibrary.MathService">
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
部分以编程方式:
myHost = new ServiceHost(typeof(MathService));
Uri address = new Uri("http://localhost:8080/MathServiceLibrary");
WSHttpBinding binding = new WSHttpBinding();
Type contract = typeof(IBasicMath);
myHost.AddServiceEndpoint(contract, binding, address);
myHost.Open();
安装服务后,我无法启动它:
ServiceMetadataBehavior的HttpGetEnabled属性设置为true,HttpGetUrl属性是相对地址,但没有http基址。提供http基址或将HttpGetUrl设置为绝对地址。
如果我将HttpGetEnabled设置为false,我可以使用该服务,但它似乎不起作用。我无法向客户端添加服务引用,当我尝试在浏览器中打开它时,我收到错误400.
你可以帮忙吗?感谢。
答案 0 :(得分:1)
可以使用带有一组基地址的ServiceHost
构造函数的重载来设置基本地址 - 请参阅ServiceHost Constructor (Type, Uri[])。
这样的事情:
myHost = new ServiceHost(typeof(MathService), new Uri[] { new Uri("http://localhost:8080/MathServiceLibrary") });
Uri address = new Uri("http://localhost:8080/MathServiceLibrary");
WSHttpBinding binding = new WSHttpBinding();
Type contract = typeof(IBasicMath);
myHost.AddServiceEndpoint(contract, binding, address);
myHost.Open();
上面没有经过测试,但想法是调用ServiceHost
在指定的URL处设置服务,并且对AddServiceEndpoint
的调用公开服务以使客户端消耗WsHttpBinding
1}}。