在1个端点,WCF,Mono中找不到客户端端点配置“*”

时间:2012-06-07 20:33:14

标签: c# linux wcf mono wcf-endpoint

Hej家伙,

我正在尝试使用Mono从我的Ubuntu主机访问托管在虚拟机(Windows 7)上的Web服务。

我可以导入wdsl文件并生成服务引用。我从正确访问webservice的其他工作客户端复制了App.config。

当我尝试使用连接到Web服务时     使用System;

namespace MonoTest
{
class MainClass
{
    public static void Main (string[] args)
    {
        Console.WriteLine ("Hello World!");
        TestServer.Service1Client client = new TestServer.Service1Client("Test");
        Console.WriteLine(client.GetData(12));
        Console.ReadLine();
    }
}
}

我收到错误:

System.InvalidOperationException: Client endpoint configuration 'Test' was not found in 1 endpoints.
  at System.ServiceModel.ChannelFactory.ApplyConfiguration (System.String endpointConfig) [0x00000] in <filename unknown>:0 
  at System.ServiceModel.ChannelFactory.InitializeEndpoint (System.String endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) [0x00000] in <filename unknown>:0 
  at System.ServiceModel.ChannelFactory`1[MonoTest.TestServer.IService1]..ctor (System.String endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) [0x00000] in <filename unknown>:0 
  at System.ServiceModel.ClientBase`1[MonoTest.TestServer.IService1].Initialize (System.ServiceModel.InstanceContext instance, System.String endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) [0x00000] in <filename unknown>:0 
  at System.ServiceModel.ClientBase`1[MonoTest.TestServer.IService1]..ctor (System.ServiceModel.InstanceContext instance, System.String endpointConfigurationName) [0x00000] in <filename unknown>:0 
  at System.ServiceModel.ClientBase`1[MonoTest.TestServer.IService1]..ctor (System.String endpointConfigurationName) [0x00000] in <filename unknown>:0 
  at MonoTest.TestServer.Service1Client..ctor (System.String endpointConfigurationName) [0x00000] in <filename unknown>:0 
  at MonoTest.MainClass.Main (System.String[] args) [0x0000a] in /home/***/WebserviceTest/MonoTest/MonoTest/Main.cs:11 

我的App.config文件如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <bindings>
            <wsHttpBinding>
                <binding name="WSHttpBinding_IService1" />
            </wsHttpBinding>
        </bindings>
        <client>
            <endpoint name="Test"
                address="http://192.168.178.34:8732/Design_Time_Addresses/TestServer/Service1/"
                binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IService1"
                contract="ServiceReference1.IService1" >
                <identity>
                    <dns value="localhost" />
                </identity>
            </endpoint>
        </client>
    </system.serviceModel>
</configuration>

是否有人使用Linux工作?

2 个答案:

答案 0 :(得分:8)

Mono的WSDL导入工具尚不支持自动配置生成,您需要在app.config中手动配置端点。

您在此处看到的错误意味着WCF无法找到端点配置部分。

问题的详细技术原因

您得到的是因为Visual Studio和Mono具有不同的,不兼容的引用配置部分的方式。

在Visual Studio中添加服务引用时,它会自动创建并更新app.config中的相应条目。生成的<endpoint ... contract="contract name">中的“合同名称”不一定是生成的Reference.cs中数据合同类的完全限定名称。

相反,Visual Studio会发出

    [ServiceContractAttribute(ConfigurationName="contract name")]
    public interface YourContract {
            ....
    }

ConfigurationName<endpoint ... contract="...">元素中的相同,这就是WCF查找端点配置的方式。

在Mono中,由于我们尚不支持配置文件生成,因此我们发出

    [ServiceContractAttribute]
    public interface YourContract {
            ....
    }

如果没有ConfigurationName参数,则默认为该接口的完全限定名称。

如何解决问题

要实现此目的,您需要编辑app.config文件,并在<endpoint ... contract="...">元素中使用服务合同界面的完全限定名称。

在您的情况下,将contract="ServiceReference1.IService1"更改为contract="TestServer.IService1"即可。

否则,查看生成的Reference.cs,搜索具有[ServiceContractAttribute]的接口以及它所在的C#名称空间。

答案 1 :(得分:0)

Mono WCF是dotnet WCF的部分实现,因此不支持很少的功能和绑定:

还有一篇文章说

无计划支持的组件

  

WSHttpBinding 及其依赖项       TransactionFlow       的ReliableSession

请参阅: http://www.mono-project.com/WCF_Development