WCF 自托管在 VS2013 中有效,但不适用于生成的 exe 文件

Posted

技术标签:

【中文标题】WCF 自托管在 VS2013 中有效,但不适用于生成的 exe 文件【英文标题】:WCF selfhosting works in VS2013 but not with generated exe-file 【发布时间】:2014-06-12 09:40:18 【问题描述】:

我已经阅读了许多关于 C# 中 WCF 的不同内容,但仍然没有为我的 noopy 问题找到令人满意的答案。 (我是 C# 和 .NET 的新手)

当我在 VS 中运行我的自托管 WCF 服务时,一切正常。当我在 VS 运行时运行我的客户端应用程序的生成的 exe 文件 (clientdir\bin\debug\consoleApp.exe) 时,它也可以正常工作。但是,当我运行生成的 exe 文件(clientdir\bin\debug\consoleApp.exe and hostdir\bin\debug\consoleApp.exe )当 VS 没有运行时,我得到一个 EndpointNotFoundException

这是我的客户端应用程序的 App.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_ImyService" />
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:1592/myService.svc"
                binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ImyService"
                contract="refmy.ImyService" name="BasicHttpBinding_ImyService" />
        </client>
    </system.serviceModel>
</configuration>

这是我的主机应用程序的 App.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MetadataBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDiscovery />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service behaviorConfiguration="MetadataBehavior" name="my.myService">
        <endpoint binding="basicHttpBinding" bindingConfiguration="" name="httpEndpoint" contract="my.ImyService" />
        <endpoint binding="netTcpBinding" bindingConfiguration="" name="netTcpEndpoint" contract="my.ImyService" />
        <endpoint address="MEX" binding="mexTcpBinding" bindingConfiguration="" name="mexEndpoint" contract="IMetadataExchange" />
        <endpoint name="udpDiscovery" kind="udpDiscoveryEndpoint" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:9400/myService" />
            <add baseAddress="net.tcp://localhost:9500/myService" />
          </baseAddresses>
        </host>
      </service>
    </services>
  </system.serviceModel>
</configuration>

这是我的宿主应用程序的 C# 代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;
using my;

namespace myHost

    class Program
    
        static void Main(string[] args)
        
            ServiceHost host = new ServiceHost(typeof(myService));
            host.Open();
            Console.ReadLine();

        
    

【问题讨论】:

您是否尝试过使用本地 IP 地址而不是 localhost? 感谢您的回复!将localhost 更改为我的本地IP,即192.168.167.61,并不能解决我的问题。现在,即使我在 VS 中调试代码,我也会得到 EndpointNotFoundException。 【参考方案1】:

您在客户端配置中有无效的端点地址。应该是这样的:

address="http://localhost:9400/myService"

【讨论】:

我不认为这是正确的。 httpEndpoint 是端点的配置名称,而不是地址。如果端点有httpEndpoint 作为地址(&lt;endpoint address="httpEndpoint"..),那么它就是正确的。【参考方案2】:

您的客户地址与服务地址不符:

<client>
        <endpoint address="http://localhost:1592/myService.svc"

服务:

<add baseAddress="http://localhost:9400/myService" />

尝试使用:

<client>
    <endpoint address="http://localhost:9400/myService".....

【讨论】:

感谢您的回复!当我将端口从 1592 更改为 9400 并不能解决我的问题。现在,即使我在 VS 中调试代码,我也会得到 EndpointNotFoundException。 您是否也将myService.svc 更改为myService(删除.svc 扩展名)? 其实我只是将myService.svc重命名为myService,但我没有myService.svc.cs重命名为myService.cs。我应该吗? 取决于 myService.svc 中的标记是否引用 myService.svc.cs。 我的例子来自一本教科书。刚才,我测试了教科书上的原始代码,我得到了同样的错误。我不确定教科书中的代码是否可能有错误。我的VS设置可能是问题吗?有没有办法向您提供我的项目代码(上传或电子邮件)?

以上是关于WCF 自托管在 VS2013 中有效,但不适用于生成的 exe 文件的主要内容,如果未能解决你的问题,请参考以下文章

WCF 服务 - 自托管服务不起作用

Intellisense 不适用于 VS2013 中的 JS

Amazon S3 静态 Web 托管不适用于自定义域名(点问题)

如果我使用VS2012如何在IIS7.0中托管WCF服务? [关闭]

如何为 SOA 有效管理/托管许多 WCF 服务

如何为自托管 WCF 服务启用跨域调用