【问题标题】:WCF self-hosting - dead in the water on Windows 10?WCF 自托管 - 在 Windows 10 上死了?
【发布时间】:2017-05-18 11:25:17
【问题描述】:

我有一个非常简单的 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>

没有什么特别的 - 只是一个普通的 wsHttpBinding 端点 http://localhost:9099/HelloService 和一个 MEX 端点。

当我构建这个主机和 WCF 服务,并在我以“管理员身份”启动的 Visual Studio 2015 中运行主机时,我收到了这条奇怪的消息:

System.ServiceModel.AddressAccessDeniedException 未处理
HResult=-2146233087
消息=HTTP 无法注册 URL http://+:9099/。您的进程没有对此命名空间的访问权限(有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=70353)。

?!?!?!?!?我是我的盒子上的ADMINISTRATOR - 为什么不允许我注册此 URL!?!?

我怀疑这是 Windows 10 (Professional - v16​​07) 的一个新“功能” - 因为我非常确定,这个设置过去只是工作在我以前的 Windows 7 机器上很好。

好的 - 所以我从命令行启动我的 WCF 主机,明确地以管理员身份 - 现在主机出现并且一切看起来都很好,我可以从 WCF 测试客户端连接到它,并且我的代码似乎运行良好。

但是,如果我现在尝试使用 SoapUI 或仅使用 IE 11 连接到它,我会不断收到另一批似乎表明此 URL 的错误消息(“无效页面”等)无法访问.....

为什么!?!

我需要在 Windows 10 专业版中做什么才能使 WCF 自托管再次工作!?

谢谢!

【问题讨论】:

    标签: wcf windows-10 self-hosting


    【解决方案1】:

    这样做的原因是您必须注册 URL。 基本上,打开一个命令行窗口 CMD(在 Windows 10 搜索中输入 CMD)

    然后使用以下脚本安装网络本地地址:(复制并右键单击粘贴)

    cd C:\Windows\Microsoft.NET\Framework\v4.0.30319

    netsh http 添加 urlacl url=http://+:8731/Design_Time_Addressesuser=DOMAIN\user

    注意:将 +8731 替换为您的 URL,将 Design_Time_Addresses 替换为您的服务名称(或者您可以将其省略,但它有助于识别 URL - 也许您有多个来自同一个 URL 的服务)

    删除网络本地地址 netsh http 删除 urlacl url=http://+:8731/Design_Time_Addresses

    然后,您需要通过 Windows 防火墙打开端口。

    在 Windows 搜索中放置:防火墙 在左侧菜单中,单击“高级设置” 然后点击左侧菜单中的“入站设置”。

    在右侧菜单中,单击“新规则”.. 这将打开一个新窗口。 选择“端口”,然后单击“下一步” 在文本框中,输入您的 URL(我的是 8731),然后单击“下一步” 保留当前选择的“允许连接”,然后单击“下一步” 保持所有复选框处于选中状态(除非您知道其他情况),然后单击“下一步”

    给它起一个与您的应用程序相关的好名字并添加描述并单击“完成”

    您现在应该可以通过网络浏览器链接到该 URL。

    如果您想向外界提供实际服务,则需要前往路由器并设置静态 IP 地址并通过防火墙打开端口。

    您可以通过 192.168.0.1 访问您的路由器(取决于您的路由器)

    显然,如果您使用笔记本电脑,那么当您将笔记本电脑带出公寓时,您的服务将不再提供给外界,因此您确实需要一台专用的台式机来充当服务器。

    您可以通过 Google 搜索了解静态 IP 和端口转发,您可以通过 Google 了解您的路由器及其防火墙设置以允许您的 URL。

    希望一切都会好起来的,如果不行,那就再问吧。

    祝你好运,玩得开心。

    这也适用于 RestApi (Asp.Net WebApi),WCF 服务通常用于金融服务公司,因为它们允许更细粒度的安全协议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 2011-07-19
      • 1970-01-01
      • 2012-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多