【问题标题】:Add methods to generated WCF client proxy code向生成的 WCF 客户端代理代码添加方法
【发布时间】:2010-06-02 00:38:04
【问题描述】:

我想在我的 WCF 客户端代理代码中为每个服务操作添加一个额外的方法(即派生自 ClientBase 的生成类)。我编写了一个具有IOperationContractGenerationExtension 实现的Visual Studio 扩展,但是这个接口似乎只公开了修改服务接口的能力,而不是ClientBase 派生类。

有没有办法在代理客户端类中生成新方法?

【问题讨论】:

  • IOOperationContextGenerationExtension 确实是 WCF 的服务器端扩展点。你想达到什么目的??只是在代理类中添加几个方法?看我的回答。再做点什么??
  • 我认为说 IOperationContextGenerationExtension 是服务器端的并不准确。它与导入过程挂钩,因此是客户端(相对于 Web 服务)。至少我是这样使用它的。

标签: code-generation wcf-client proxy-classes


【解决方案1】:

据我所知,这些类总是部分类

public partial class MyWCFServiceClient : ClientBase<IMyWCFService>, IMyWCFService 
{
  ...
}

因此您可以使用自己的第二个文件轻松扩展它们,该文件将方法添加到同一个部分类:

YourOwnFile.cs

public partial class MyWCFServiceClient 
{
   public void NewMethod1()
   {
   }

   public void NewMethod2()
   {
   }
}

【讨论】:

  • 感谢您的回答。我正在尝试做的是自动生成其他方法。如果可能的话,我想避免手写它们。
  • @dcstraw:根据什么自动生成?这些方法有什么作用? WCF 有很多可扩展点 - 在客户端和服务器上 - 但您必须更具体地了解您正在尝试做的事情,以便我们能够帮助并引导您朝着正确的方向前进....
  • 我想为每个返回 IObservable 的操作添加一个方法,这样我就可以将 Rx 与 Web 服务方法一起使用,而无需从异步事件手动创建 IObservables。
【解决方案2】:

我通过在导入过程中为 ClientBase 派生类生成一个包装类来解决这个问题。实际上,我首先尝试生成一个与客户端类同名的附加部分类,但这导致其余代码生成停止正常工作。

所以我最终生成的代码如下所示:

(由内置的 WCF 代理生成器生成):

public interface ServiceReference1
{
    IAsyncResult BeginWebMethod1(AsyncCallback callback, object asyncState);
    void EndWebMethod1(IAsyncResult result);

    IAsyncResult BeginWebMethod2(AsyncCallback callback, object asyncState);
    void EndWebMethod2(IAsyncResult result);

    // ...
}

public class ServiceReference1Client
{
    public event EventHandler<AsyncCompletedEventArgs> WebMethod1Completed;
    public event EventHandler<AsyncCompletedEventArgs> WebMethod2Completed;

    public void WebMethod1Async() { /* ... */ }
    public void WebMethod2Async() { /* ... */ }

    // ...
}

(由我的自定义IOperationContractGenerationExtension生成):

public class ServiceReference1Wrapper
{
    private ServiceReference1Client _client;

    public ServiceReference1Wrapper(ServiceReference1Client client)
    {
        _client = client;
    }

    public IObservable<AsyncCompletedEventArgs> WebMethod1()
    {
        _client.WebMethod1Async();
        // ...
    }

    public IObservable<AsyncCompletedEventArgs> WebMethod2()
    {
        _client.WebMethod2Async();
        // ...
    }

    // ...
}

注意:我使用的是 Silverlight,所以一切都是异步的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 2012-04-30
    相关资源
    最近更新 更多