【问题标题】:ChannelFactory<T> without interfaceChannelFactory<T> 无接口
【发布时间】:2012-02-20 19:23:12
【问题描述】:

我目前正在尝试创建一个调用 WCF SOAP 服务的 REST 代理,但我一直在尝试创建一个通道来发送消息。我知道我需要使用ChannelFactory,但是我没有服务的接口。我可以传递一个默认值吗?有没有其他方法来打包消息?

当我说消息时,我指的是来自 ServiceModels.Channels.Message 的消息。

我对此很陌生,因此我们将不胜感激。

【问题讨论】:

  • 您的 Web 服务不能同时是 based on REST and use SOAP。是哪一个?
  • 这就是为什么它是一个代理,它接受一个休息调用,从休息调用中提取一个参数,将其打包为一个肥皂消息,将其发送到肥皂服务,获取响应,解析它,并通过 rest 服务发回
  • 我明白了。我误解了 proxy 这个词,我以为您的意思是客户端代理 :) 缺少 SOAP 服务的接口吗?
  • 是的,我想知道是否有我可以使用的默认界面
  • 你有服务的 WSDL 契约吗?

标签: c# wcf soap


【解决方案1】:

您可以通过以下两种方式之一从 WSDL 服务合同中generate a WCF client

无论哪种方式都将生成与服务合同公开的类型相对应的 .NET 类以及可用于调用服务操作的WCF client proxy class

try
{
    var client = new MyServiceClient();
    client.DoSomething();
    client.Close();
}
catch
{
    if (client != null)
    {
         client.Abort();
    }
}

如果您更喜欢使用较低级别的ChannelFactory API,则应使用生成的IClientChannel 接口代替:

try
{
    var factory = new ChannelFactory<MyServiceChannel>();
    var client = factory.CreateChannel();
    client.DoSomething();
    client.Close();
}
catch
{
    if (client != null)
    {
         client.Abort();
    }
}

【讨论】:

  • 谢谢,我最终从服务器获得了对源的访问权限,并且只是复制了我需要的接口,但是如果我只有 wsdl 也可以解决这个问题,所以我接受这。谢谢。
  • @SmashCode 我明白了。我以为您在其中一个 cmets 中说过您确实拥有 WSDL 合同。无论如何,我很高兴能帮上忙 :)
  • 恩里科,我的评论措辞很奇怪。我确实有 WSDL,但现在我有 WSDL 和源,所以我只使用源而不是 WSDL,但如果我只有 WSDL 而不是源,你的答案会奏效。
【解决方案2】:

ChannelFactory.CreateChannel 创建一个实现提供的接口和IClientChannel 的对象。该接口必须与服务匹配。

您不需要与服务使用相同的 DLL。您可以创建自己的接口来匹配服务的定义。在ServiceContract 属性中设置名称和命名空间以匹配服务的名称。

【讨论】:

  • 有没有办法从 wsdl 自动生成这个?
  • @SmashCode 是,使用 Visual Studio 中的 添加服务引用 对话框或 svcutil 命令行实用程序。
猜你喜欢
  • 2017-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-15
  • 2016-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多