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

np.*_*np. 7 console wcf

我正在尝试创建一个简单的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();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我添加了一个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>
Run Code Online (Sandbox Code Playgroud)

当我运行主机控制台应用程序时,我得到此异常:

System.InvalidOperationException未处理Message ="找不到与端点绑定MetadataExchangeHttpBinding的方案http匹配的基址.注册的基址方案是[net.tcp]."
Source ="System.ServiceModel"
StackTrace:在System.ServiceModel.ServiceHostBase.MakeAbsoluteUri(Uri relativeOrAbsoluteUri,绑定绑定,UriSchemeKeyedCollection baseAddresses)处于System.ServiceModel.Description.ConfigLoader.LoadServiceDescription(ServiceHostBase主机,ServiceDescription描述,ServiceElement serviceElement,Action`1系统中的System.ServiceModel.ServiceHostBase.LoadConfigurationSectionInternal(ConfigLoader configLoader,ServiceDescription描述,String configurationName)中的System.ServiceModel.ServiceHostBase.LoadConfigurationSectionInternal(ConfigLoader configLoader,ServiceDescription description,ServiceElement serviceSection)处的SystemBay.ServiceModel.ServiceHostBase.ApplyConfiguration()处的addBaseAddress) System.ServiceModel.ServiceHost..ctor上的System.ServiceModel.ServiceHost.InitializeDescription(类型serviceType,UriSchemeKeyedCollection baseAddresses)中的.ServiceModel.ServiceHostBase.InitializeDescription(UriSchemeKeyedCollection baseAddresses)e serviceType,Uri [] baseAddresses)位于C:\ Documents and Settings \navin.pathuru\My Documents\Visual Studio 2008\Projects\Solution2\HostConsoleApplication\Program.cs中的HostConsoleApplication.Program.Main(String [] args):line 13位于System.Threading的Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()的System.AppDomain.ExecuteAssembly(String assemblyFile,Evidence assemblySecurity,String [] args)上的System.AppDomain._nExecuteAssembly(Assembly assembly,String [] args) System.Threading.ThreadHelper.ThreadStart()中的System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback回调,对象状态)中的.ThreadHelper.ThreadStart_Context(Object state):InnerException:

只是想知道如何解决这个问题.谢谢你

mar*_*c_s 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>
Run Code Online (Sandbox Code Playgroud)

解决方案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>
Run Code Online (Sandbox Code Playgroud)

解决方案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>
Run Code Online (Sandbox Code Playgroud)

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

需要注意的一点是:我发现调用服务行为配置"ServiceBehavior"是非常危险的......

<serviceBehaviors>
    <behavior name="ServiceBehavior" >
Run Code Online (Sandbox Code Playgroud)

我的建议:调用你的第一个和默认配置只是简单的"默认"(或"DefaultBehavior")

<serviceBehaviors>
    <behavior name="Default" >
Run Code Online (Sandbox Code Playgroud)

如果你有多个配置,只开始给出其他名称.

打电话给这个ServiceBehavior似乎是在以后的某个时候惹麻烦......