在控制台中托管简单的Wcf服务

在控制台中托管简单的Wcf服务,wcf,console,Wcf,Console,我正在尝试创建一个简单的控制台应用程序,我想在其中托管一个简单的wcf服务 这是我的密码 namespace HostConsoleApplication { class Program { static void Main(string[] args) { using (System.ServiceModel.ServiceHost host = new System.ServiceModel.ServiceHost(ty

我正在尝试创建一个简单的控制台应用程序,我想在其中托管一个简单的wcf服务

这是我的密码

namespace HostConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            using (System.ServiceModel.ServiceHost host = new System.ServiceModel.ServiceHost(typeof(FirstWcfService.Service)))
            {
                host.Open();
                Console.WriteLine("Sai");
                Console.ReadLine();
            }
        }
    }
}
然后我添加了一个app.config,如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <services>
            <service name="FirstWcfService.Service" behaviorConfiguration="ServiceBehavior">
                <endpoint address="FirstWcfService" binding="netTcpBinding" contract="FirstWcfService.IService"/>
                <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
                <host>
                    <baseAddresses>
                        <add baseAddress="net.tcp://localhost:9101/"/>
                    </baseAddresses>
                </host>
            </service>
        </services>
        <behaviors>
            <serviceBehaviors>
                <behavior name="ServiceBehavior" >
                    <serviceMetadata httpGetEnabled="false" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
    </system.serviceModel>
</configuration>

当我运行主机控制台应用程序时,出现以下异常:

System.InvalidOperationException为 未处理的消息=“找不到 与http方案匹配的基址 对于具有绑定的端点 MetadataExchangeHttpBinding。 注册基址方案包括 [net.tcp]。“
Source=“System.ServiceModel”
堆栈跟踪: 在System.ServiceModel.ServiceHostBase.MakeAbsoluteUri(Uri 相对论 绑定,UriSchemeKeyedCollection 基本地址) 位于System.ServiceModel.Description.ConfigLoader.LoadServiceDescription(ServiceHostBase 主机,服务描述, ServiceElement ServiceElement, 操作'1 addBaseAddress) 位于System.ServiceModel.ServiceHostBase.LoadConfigurationSectionInternal(ConfigLoader configLoader,服务描述 描述,ServiceElement 服务科) 位于System.ServiceModel.ServiceHostBase.LoadConfigurationSectionInternal(ConfigLoader configLoader,服务描述 说明,字符串配置(名称) 在System.ServiceModel.ServiceHostBase.ApplyConfiguration()中 在System.ServiceModel.ServiceHostBase.InitializeDescription(urischemeKeydCollection)中 基本地址) 在System.ServiceModel.ServiceHost.InitializeDescription(类型 服务类型,UriSchemeKeyedCollection 基本地址) 在System.ServiceModel.ServiceHost..ctor(类型 服务类型,Uri[]基本地址) 在HostConsoleApplication.Program.Main上(字符串[]) C:\Documents和 设置\navin.pathuru\My 文档\ Visual Studio 2008\Projects\Solution2\HostConsoleApplication\Program.cs:line 13 位于System.AppDomain.\u下一个安全组件(程序集 程序集,字符串[]args) 位于System.AppDomain.ExecuteAssembly(字符串 档案、证据 assemblySecurity,字符串[]args) 在Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()上 在System.Threading.ThreadHelper.ThreadStart\u上下文(对象 (州) 在System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback 回调(对象状态) 位于System.Threading.ThreadHelper.ThreadStart()处 内部异常:

只是想知道如何解决这个问题。 谢谢
嗯,我认为问题在于:

  • 您有net.tcp的基址
  • 您定义了一个MEX http端点(但没有http基址)
基本上,如果希望通过http使用MEX,则需要为MEX端点提供完整地址,或http基址(如果仅指定相对地址)

解决方案1:指定MEX端点的完整地址:

 <services>
    <service name="FirstWcfService.Service" 
              behaviorConfiguration="ServiceBehavior">
       <endpoint 
           address="FirstWcfService" 
           binding="netTcpBinding" 
           contract="FirstWcfService.IService"/>
       <endpoint 
           address="http://localhost:9102/FirstWcfService/mex"
           binding="mexHttpBinding" 
           contract="IMetadataExchange"  />
        ......
    </service>
</services>

......
解决方案2:还要定义HTTP基址:

 <services>
    <service name="FirstWcfService.Service" 
              behaviorConfiguration="ServiceBehavior">
       <endpoint 
           address="FirstWcfService" 
           binding="netTcpBinding" 
           contract="FirstWcfService.IService"/>
       <endpoint 
           address="mex"
           binding="mexHttpBinding" 
           contract="IMetadataExchange"  />
       <host>
           <baseAddresses>
               <add baseAddress="net.tcp://localhost:9101/"/>
               <add baseAddress="http://localhost:9102/"/>
           </baseAddresses>
       </host>
    </service>
</services>

解决方案3:改用mexTcpBinding

 <services>
    <service name="FirstWcfService.Service" 
              behaviorConfiguration="ServiceBehavior">
       <endpoint 
           address="FirstWcfService" 
           binding="netTcpBinding" 
           contract="FirstWcfService.IService"/>
       <endpoint 
           address="mex"
           binding="mexTcpBinding" 
           contract="IMetadataExchange"  />
        ......
    </service>
</services>

......
这三个选项中的任何一个都应该解决这个问题

警告:我发现将您的服务行为配置称为“ServiceBehavior”是非常危险的


我的建议是:将您的第一个和默认配置称为纯“default”(或“DefaultBehavior”)


并且只有当您有多个配置时才开始给出其他名称


调用此
ServiceBehavior
似乎只是在以后的某个时候自找麻烦….

您需要突出显示代码行和XML,并使用编辑器工具栏中的“代码”按钮(101 010)以获得良好的结果-格式良好,语法突出显示!太好了,谢谢你,马克。我已将另一个控制台应用程序作为客户端添加到此解决方案。您能告诉我如何使用ConsoleHost中的这项服务吗。感谢从cmd.exe启动您的第一个控制台;然后转到Visual Studio,在客户端控制台应用程序中,从解决方案资源管理器上下文菜单中选择“添加服务引用”,并键入(或粘贴)服务运行的URL,然后该URL将发现该服务并创建必要的客户端位供您使用。
<serviceBehaviors>
    <behavior name="ServiceBehavior" >
<serviceBehaviors>
    <behavior name="Default" >