首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WCF客户端-最佳实践

WCF客户端-最佳实践
EN

Stack Overflow用户
提问于 2012-09-17 23:35:52
回答 3查看 741关注 0票数 2

我只是想听听你对WCF客户端实现的看法。

我有一个服务器,它提供像SecurityManager这样的几种服务。此服务在接口ISecurityManager中定义,并在类SecurityManager中实现。

到目前为止,一切都很好。在客户端,我想通过一个单独的类来实现服务调用。我的问题是,我是否也在实现相同ISecurityManager接口的SecurityManager类中这样做?

这里最好的实践是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-17 23:54:58

Visual Studio生成器

您可以要求Visual Studio为您构建一个客户端,右键单击您的客户端项目并添加一个Service Reference。有一个对话框,您可以在其中输入您的服务url或从解决方案中发现它。

创建客户端

您可以构建继承自ClientBase<ISecurityManager>, ISecurityManager的客户端类。作为此客户端类上的操作示例:

代码语言:javascript
复制
public void ExampleMethod(int id)
{
   Channel.ExampleMethod(id);
}

就像一个真正的男人一样

或者不使用任何客户端类,只需调用它:

代码语言:javascript
复制
ServiceInvokerinvoker invoker = new ServiceInvoker(); 
var result = invoker.InvokeService<ISecurityManager, ReturnType>(     proxy => proxy.ExampleMethod(1) ); 

最后两个选项假设您已经配置了ISecurityManager客户端:

代码语言:javascript
复制
<client>     
<endpoint name="ServiceName" 
address="http://ServiceName.test/Service" 
binding="basicHttpBinding"   
contract="ISecurityManager" /> 
</client> 
票数 2
EN

Stack Overflow用户

发布于 2012-09-17 23:41:56

我建议使用通用包装器进行WCF调用。所以每次你需要调用WCF时,你可以这样做:

代码语言:javascript
复制
var invoker = new ServiceInvoker();
        var result = invoker.InvokeService<ISecurityManager, MyObjectReturnType>(
            proxy => proxy.DoSomething(myParameters));
        return result;

我使用ServiceInvoker创建通道并管理内部可能发生的任何异常。它使用ISecurityManager协定创建一个通道,返回类型为MyObjectReturnType,操作为DoSomething (来自ISecurityManager协定的方法)。您可以将此解决方案用于您的所有接口,而无需任何额外的类实现!

InvokeService应该是这样的:

代码语言:javascript
复制
public TResult InvokeService<TServiceContract, TResult>(Func<TServiceContract, TResult> invokeHandler) where TServiceContract : class
    {
        ICommunicationObject communicationObject;
        var arg = CreateCommunicationObject<TServiceContract>(out communicationObject);
        var result = default(TResult);
        try
        {
            result = invokeHandler(arg);
        }
        catch (Exception ex)
        {
            Logger.Log(ex);
            throw;
        }

        finally
        {
            try
            {
                if (communicationObject.State != CommunicationState.Faulted)
                    communicationObject.Close();
            }
            catch
            {
                communicationObject.Abort();
            }
        }
        return result;
    }

private TServiceContract CreateCommunicationObject<TServiceContract>(out ICommunicationObject communicationObject)
        where TServiceContract : class
    {
        //Create the Channel
        // ICommunicationObject is an out parameter for disposing purposes 
        return channel;
    }
票数 2
EN

Stack Overflow用户

发布于 2012-09-17 23:53:36

要“通过单独的类”实现服务调用,只需使用svcutil.exe或visual studio从服务的运行实例中生成服务引用即可。

这将从您的服务合同中生成一组类型,这些类型将与包含您的服务合同和实现的程序集完全“分离”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12462596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档