c# - 无法启动 wcf 服务主机

标签 c# .net wcf visual-studio-2012 servicehost

我正在尝试为我的 WCF 应用程序创建一个服务主机。当我启动应用程序时,我收到一条错误消息

The service cannot be started. This service has no endpoint defined. Please add at least one endpoint for the service in config file and try again.

我遵循了 PluralSight 上的教程,这是我想出的代码

using System.ServiceModel;
using FreedomService;

namespace ConsoleHost
{
    class Program
    {
        static void Main(string[] args)
        {
            var host = new ServiceHost(typeof(PeopleService));
            host.AddServiceEndpoint(typeof (IPeopleService), new BasicHttpBinding(),
                                    "http://localhost:8080/people/basic");
            host.AddServiceEndpoint(typeof(IPeopleService), new WSHttpBinding(), 
                                    "http://localhost:8080/people/ws");
            host.AddServiceEndpoint(typeof(IPeopleService), new NetTcpBinding(), 
                                    "net.tcp://localhost:8081/people");
            try
            {
                host.Open();
                PrintServiceInfo(host);
                Console.ReadLine();
                host.Close();
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                host.Abort();
            }
        }

        static void PrintServiceInfo(ServiceHost host)
        {
            Console.WriteLine("{0} is up and running with these endpoints:",host.Description.ServiceType);
            foreach (var endpoint in host.Description.Endpoints)
            {
                Console.WriteLine(endpoint.Address);
            }
        }

    }
}

IPeopleService.cs

[ServiceContract]
public interface IPeopleService
{
    [OperationContract]
    string GetData(int value);

    [OperationContract]
    PersonType GetPersonById(int id);
}

PeopleService.cs

public class PeopleService : IPeopleService, IDisposable
    {
        private ICollection<PersonType> People = new Collection<PersonType>
            {
                //...
            };
        public string GetData(int value)
        {
            return string.Format("You entered: {0}", value);
        }

        public PersonType GetPersonById(int id)
        {
            var person = People.First(p => p.Id == id);
            if (person!= null)
                return person;
            throw new InvalidDataException(string.Format("No Person with the id: {0} found.",id));
        }

        public void Dispose()
        {
            this.People = null;
        }
    }

应用程序配置

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
</configuration>

servicelibrary 的 app.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" />
  </system.web>
  <!-- When deploying the service library project, the content of the config file must be added to the host's 
  app.config file. System.Configuration does not support config files for libraries. -->
  <system.serviceModel>
    <services>
      <service name="FreedomService.PeopleService">
        <host>
          <baseAddresses>
            <add baseAddress = "http://localhost:8733/Design_Time_Addresses/FreedomService/basic/" />
          </baseAddresses>
        </host>
        <!-- Service Endpoints -->
        <!-- Unless fully qualified, address is relative to base address supplied above -->
        <endpoint address="" binding="basicHttpBinding" contract="FreedomService.IPeopleService">
          <!-- 
              Upon deployment, the following identity element should be removed or replaced to reflect the 
              identity under which the deployed service runs.  If removed, WCF will infer an appropriate identity 
              automatically.
          -->
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <!-- Metadata Endpoints -->
        <!-- The Metadata Exchange endpoint is used by the service to describe itself to clients. --> 
        <!-- This endpoint does not use a secure binding and should be secured or removed before deployment -->
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, 
          set the values below to false before deployment -->
          <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/>
          <!-- To receive exception details in faults for debugging purposes, 
          set the value below to true.  Set to false before deployment 
          to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

最佳答案

tl;dr; 修复 App.config

中的名称

对我来说,这个问题是由 ReSharper 触发的:我重命名了服务,但它并没有在所有地方重命名。

进入 App.config 更正服务和接口(interface)名称以解决问题。

关于c# - 无法启动 wcf 服务主机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16989788/

相关文章:

c# - 如何从数据网格单元格中获取字符串值?

c# - 结构编码,编码 ansi 和 unicode

.net - .NET 中真正的字符串是什么?

.net - 支持存储过程的 MS(正在进行?)嵌入式(无服务器)SQL Server 版本的名称是什么?

WCF : maxConcurrentCalls has exhausted

使用 Ninject Dispose 的 WCF 未在 requestscope 中触发

c# - 使用自定义属性创建角色检查器

c# - 在Mysql中使用正确的语法错误

c# - DbDataReader、NextResult() 和填充多个表

c# - 我应该使用 Closing 事件还是重写 OnClosing?