我有一个非常简单的 WCF服务 - 这是服务合同:
[ServiceContract]
public interface IHelloService
{
[OperationContract]
string SayGreeting(string name);
[OperationContract]
string SayRudeGreeting(string name);
}
这是实施:
public class HelloService : IHelloService
{
public string SayGreeting(string name)
{
return "Well, hello there, " + name;
}
public string SayRudeGreeting(string name)
{
return string.Format("What do you want, {0} ?", name);
}
}
这不是有趣的部分:-)我正在尝试做的是自托管这个简单的服务在Windows命令行应用程序中。我是用这些代码行完成的:
Uri baseAddress = new Uri("http://localhost:9099");
using (ServiceHost host = new ServiceHost(typeof(HelloService), baseAddress))
{
host.Open();
Console.WriteLine("HelloService is up and running ....");
Console.ReadKey();
Console.WriteLine("HelloService - closing down...");
}
我对该主持人有一个非常简单,直截了当的app.config
:
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="DevDebug">
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service name="WcfService1.HelloService"
behaviorConfiguration="DevDebug">
<endpoint
address="HelloService"
binding="wsHttpBinding"
contract="WcfService1.IHelloService" />
<endpoint
address="HelloService/mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
</system.serviceModel>
根本没什么好看的 - 只是wsHttpBinding
的常规http://localhost:9099/HelloService
端点和MEX端点。
当我构建此主机和WCF服务,并在 Visual Studio 2015中运行主机时,我启动“以管理员身份”,我收到了这条奇怪的消息:
System.ServiceModel.AddressAccessDeniedException未处理
的HResult = -2146233087
Message = HTTP无法注册URL http://+:9099/。您的进程没有此命名空间的访问权限(有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=70353)。
?!?!?!?!?我在我的邮箱上是 ADMINISTRATOR - 为什么我不能被允许注册这个URL!?!?
我怀疑这是Windows 10的新“功能”(专业版 - v1607) - 因为我非常肯定,这个设置过去只是工作在我以前的Windows 7盒子上很好。
好的 - 所以我从命令行启动我的WCF主机,显式作为管理员 - 现在主机出现,一切似乎都很好,我可以从WCF测试客户端连接到它,我的代码似乎工作正常。
但是,如果我现在尝试使用 SoapUI 或IE 11连接到它,我会不断收到一些错误消息(“无效页面”等)似乎表明此URL无法访问.....
为什么!?!
我需要在Windows 10 Professional中执行 以使WCF自托管再次工作!
谢谢!
答案 0 :(得分:1)
原因是您必须注册URL。 基本上,打开命令行窗口CMD(在Windows 10搜索中键入CMD)
然后使用以下脚本安装网络本地地址:(复制并右键单击粘贴)
cd C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319
netsh http add urlacl url = http://+:8731/Design_Time_Addresses user = DOMAIN \ user
注意:用您的URL替换+8731,用您的服务名称替换Design_Time_Addresses(或者您可以将其删除,但它有助于识别URL - 也许您有来自同一网址的多个服务)
删除网络本地地址 netsh http delete urlacl url = http://+:8731/Design_Time_Addresses
然后,您需要通过Windows防火墙打开端口。
在Windows搜索中:防火墙 在左侧菜单中,点击&#39;高级设置&#39; 然后点击“入站设置”&#39;在左侧菜单中。
在右侧菜单中,点击&#39;新规则&#39; ..这打开了一个新窗口。 选择&#39; Port&#39;然后点击&#39;下一步&#39; 在文本框中,输入您的网址(我的是8731),然后点击&#39;下一步&#39; 保持当前选择的“允许连接”#39;然后点击&#39;下一步&#39; 单击所有复选框(除非您另有说明),然后单击“下一步”
为其提供与您的申请相关的好名称并添加说明,然后点击“完成”
您现在应该可以通过网络浏览器链接到该网址。
如果您想向外界提供实际服务,那么您需要转到路由器并设置静态IP地址并通过防火墙打开端口。
您可以通过192.168.0.1(取决于您的路由器)到达您的路由器
显然,如果您使用笔记本电脑,那么第二次将笔记本电脑从您的公寓中取出,那么您的服务将不再可用于外部世界,因此您确实需要专用台式机作为服务器。
您可以通过Google搜索找到有关静态IP和端口转发的信息,您可以通过谷歌了解您的路由器及其防火墙设置以获取您的网址。
希望,如果没有,它会全部解决,然后再问一次。
祝你好运,玩得开心。
这也适用于RestApi(Asp.Net WebApi),WCF服务通常用于金融服务公司,因为它们允许更细粒度的安全协议。