WCF自托管 - 在Windows 10上死机?

时间:2017-05-18 11:25:18

标签: wcf windows-10 self-hosting

我有一个非常简单的 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自托管再次工作!

谢谢!

1 个答案:

答案 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服务通常用于金融服务公司,因为它们允许更细粒度的安全协议。