WCF 自托管 - 在 Windows 10 上死于水中?
WCF self-hosting - dead in the water on Windows 10?
我有一个非常简单 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);
}
}
那不是有趣的部分 :-) 我想做的是 self-host 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>
一点也不花哨 - 只是 http://localhost:9099/HelloService
处的一个常规 wsHttpBinding
端点和一个 MEX 端点。
当我构建此主机和 WCF 服务时,运行 主机 在 Visual Studio 2015 内 "As Administrator",我得到这条奇怪的消息:
System.ServiceModel.AddressAccessDeniedException was unhandled
HResult=-2146233087
Message=HTTP could not register URL http://+:9099/. Your process does not have access rights to this namespace (see http://go.microsoft.com/fwlink/?LinkId=70353 for details).
?!?!?!?!? 我是我的 ADMINISTRATOR - 为什么不允许我注册此 URL!?!?
我怀疑这是 Windows 10(专业版 - v1607)的新 "feature" - 因为我是 很确定,这个设置在我以前的 Windows 7 盒子上工作得很好。
好的 - 所以我从命令行启动我的 WCF 主机,明确地 作为管理员 - 现在主机出现并且一切正常,我可以从WCF 测试客户端,我的代码似乎工作正常。
但是如果我现在尝试使用 SoapUI 或仅使用 IE 11 连接到它,我会不断收到另一组错误消息("invalid page" 等)好像提示这个URL无法访问.....
为什么!?!
在 Windows 10 Professional 中,我需要做什么 才能使 WCF 自托管再次工作!?
谢谢!
这是因为您必须注册 URL。
基本上,打开命令行 window CMD(在 Windows 10 搜索中键入 CMD)
然后使用以下脚本安装网络本地地址:(复制并右键单击粘贴)
cd C:\Windows\Microsoft.NET\Framework\v4.0.30319
netsh http 添加 urlacl url=http://+:8731/Design_Time_Addresses 用户=DOMAIN\user
注意:将 +8731 替换为您的 URL 并将 Design_Time_Addresses 替换为您的服务名称(或者您可以将其省略,但这有助于识别 URL - 也许您从同一个 URL)
获得不止一项服务
删除网络本地地址
netsh http delete urlacl url=http://+:8731/Design_Time_Addresses
然后,您需要通过Windows防火墙打开端口。
在Windows搜索放:防火墙
在左侧菜单中,单击 'Advance Settings'
然后点击左侧菜单中的'Inbound Settings'。
在右侧菜单中,单击 'New Rule' .. 这会打开一个新的 window。
Select 'Port' 然后点击 'Next'
在文本框中,输入您的 URL(我的是 8731)并单击 'Next'
保留 'Allow the connection' 的当前选择并单击 'Next'
保持所有复选框都处于选中状态(除非您另有所知),然后单击 'Next'
给它起一个与您的应用程序相关的好名字并添加描述,然后单击 'Finish'
您现在应该可以通过网络浏览器 link 到 URL。
如果您想向外界提供实际服务,那么您需要转到您的路由器并设置一个静态 IP 地址,并通过您的防火墙打开端口。
您可以通过 192.168.0.1 访问您的路由器(取决于您的路由器)
显然,如果您使用的是笔记本电脑,那么一旦您将笔记本电脑从您的公寓中取出,您的服务将不再对外界可用,因此您确实需要一台专用的台式机来充当服务器。
您可以从 Google 搜索中找到有关静态 IP 和端口转发的信息,并且您可以 Google 关于您的路由器及其防火墙设置以允许您 URL.
希望一切顺利,如果没有,再问一次。
祝你好运,玩得开心。
这也适用于 RestApi (Asp.Net WebApi),WCF 服务通常用于金融服务公司,因为它们允许更细粒度的安全协议。
我有一个非常简单 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);
}
}
那不是有趣的部分 :-) 我想做的是 self-host 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>
一点也不花哨 - 只是 http://localhost:9099/HelloService
处的一个常规 wsHttpBinding
端点和一个 MEX 端点。
当我构建此主机和 WCF 服务时,运行 主机 在 Visual Studio 2015 内 "As Administrator",我得到这条奇怪的消息:
System.ServiceModel.AddressAccessDeniedException was unhandled
HResult=-2146233087
Message=HTTP could not register URL http://+:9099/. Your process does not have access rights to this namespace (see http://go.microsoft.com/fwlink/?LinkId=70353 for details).
?!?!?!?!? 我是我的 ADMINISTRATOR - 为什么不允许我注册此 URL!?!?
我怀疑这是 Windows 10(专业版 - v1607)的新 "feature" - 因为我是 很确定,这个设置在我以前的 Windows 7 盒子上工作得很好。
好的 - 所以我从命令行启动我的 WCF 主机,明确地 作为管理员 - 现在主机出现并且一切正常,我可以从WCF 测试客户端,我的代码似乎工作正常。
但是如果我现在尝试使用 SoapUI 或仅使用 IE 11 连接到它,我会不断收到另一组错误消息("invalid page" 等)好像提示这个URL无法访问.....
为什么!?!
在 Windows 10 Professional 中,我需要做什么 才能使 WCF 自托管再次工作!?
谢谢!
这是因为您必须注册 URL。 基本上,打开命令行 window CMD(在 Windows 10 搜索中键入 CMD)
然后使用以下脚本安装网络本地地址:(复制并右键单击粘贴)
cd C:\Windows\Microsoft.NET\Framework\v4.0.30319
netsh http 添加 urlacl url=http://+:8731/Design_Time_Addresses 用户=DOMAIN\user
注意:将 +8731 替换为您的 URL 并将 Design_Time_Addresses 替换为您的服务名称(或者您可以将其省略,但这有助于识别 URL - 也许您从同一个 URL)
获得不止一项服务删除网络本地地址 netsh http delete urlacl url=http://+:8731/Design_Time_Addresses
然后,您需要通过Windows防火墙打开端口。
在Windows搜索放:防火墙 在左侧菜单中,单击 'Advance Settings' 然后点击左侧菜单中的'Inbound Settings'。
在右侧菜单中,单击 'New Rule' .. 这会打开一个新的 window。 Select 'Port' 然后点击 'Next' 在文本框中,输入您的 URL(我的是 8731)并单击 'Next' 保留 'Allow the connection' 的当前选择并单击 'Next' 保持所有复选框都处于选中状态(除非您另有所知),然后单击 'Next'
给它起一个与您的应用程序相关的好名字并添加描述,然后单击 'Finish'
您现在应该可以通过网络浏览器 link 到 URL。
如果您想向外界提供实际服务,那么您需要转到您的路由器并设置一个静态 IP 地址,并通过您的防火墙打开端口。
您可以通过 192.168.0.1 访问您的路由器(取决于您的路由器)
显然,如果您使用的是笔记本电脑,那么一旦您将笔记本电脑从您的公寓中取出,您的服务将不再对外界可用,因此您确实需要一台专用的台式机来充当服务器。
您可以从 Google 搜索中找到有关静态 IP 和端口转发的信息,并且您可以 Google 关于您的路由器及其防火墙设置以允许您 URL.
希望一切顺利,如果没有,再问一次。
祝你好运,玩得开心。
这也适用于 RestApi (Asp.Net WebApi),WCF 服务通常用于金融服务公司,因为它们允许更细粒度的安全协议。