我正在尝试创建一个简单的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:
只是想知道如何解决这个问题。 谢谢 Ñ
答案 0 :(得分:15)
嗯,我认为问题是:
基本上,如果您想通过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
似乎在以后的某段时间内要求麻烦......