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

时间:2010-02-12 11:51:32

标签: wcf console

我正在尝试创建一个简单的ConsoleApplication,我希望在其中托管一个简单的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是   未处理的消息=“找不到   与scheme http匹配的基址   对于具有绑定的端点   MetadataExchangeHttpBinding。   注册的基地址方案是   [的net.tcp]。“
  来源= “System.ServiceModel”
  堆栈跟踪:          在System.ServiceModel.ServiceHostBase.MakeAbsoluteUri(Uri   relativeOrAbsoluteUri,Binding   绑定,UriSchemeKeyedCollection   baseAddresses)          在System.ServiceModel.Description.ConfigLoader.LoadServiceDescription(ServiceHostBase)   主机,ServiceDescription描述,   ServiceElement serviceElement,   Action`1 addBaseAddress)          在System.ServiceModel.ServiceHostBase.LoadConfigurationSectionInternal(ConfigLoader)   configLoader,ServiceDescription   description,ServiceElement   serviceSection)          在System.ServiceModel.ServiceHostBase.LoadConfigurationSectionInternal(ConfigLoader)   configLoader,ServiceDescription   description,String configurationName)          在System.ServiceModel.ServiceHostBase.ApplyConfiguration()          在System.ServiceModel.ServiceHostBase.InitializeDescription(UriSchemeKeyedCollection)   baseAddresses)          在System.ServiceModel.ServiceHost.InitializeDescription(Type   serviceType,UriSchemeKeyedCollection   baseAddresses)          在System.ServiceModel.ServiceHost..ctor(Type   serviceType,Uri [] baseAddresses)          在HostConsoleApplication.Program.Main(String []   args)在C:\ Documents和   设置\ navin.pathuru \我的   Documents \ Visual Studio   2008 \项目\溶液2 \ HostConsoleApplication \的Program.cs:行   13          在System.AppDomain._nExecuteAssembly(程序集   assembly,String [] args)          在System.AppDomain.ExecuteAssembly(String   assemblyFile,Evidence   assemblySecurity,String [] args)          在Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()          在System.Threading.ThreadHelper.ThreadStart_Context(Object   州)          在System.Threading.ExecutionContext.Run(ExecutionContext   executionContext,ContextCallback   回调,对象状态)          在System.Threading.ThreadHelper.ThreadStart()   的InnerException:

只是想知道如何解决这个问题。 谢谢 Ñ

1 个答案:

答案 0 :(得分:15)

嗯,我认为问题是:

  • 您有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”非常危险......

<serviceBehaviors>
    <behavior name="ServiceBehavior" >

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

<serviceBehaviors>
    <behavior name="Default" >

如果您有多个配置,则仅开始提供其他名称。

调用此ServiceBehavior似乎在以后的某段时间内要求麻烦......