WCF服务创建单独的代理类

时间:2014-04-25 19:34:56

标签: c# wcf

我有一个WCF服务方法,它将MembershipCreateStatusSystem.Web.Security)发送回调用方法。当我查看服务定义时,它已将枚举重新创建为MyProject.MyWebService.MembershipCreateStatus的类型,因此它本质上是一个完全不同的对象。

有没有一种方法可以告诉服务定义使用System.Web.Security类,即使它是在WCF服务中?

1 个答案:

答案 0 :(得分:0)

你可以。您需要使用KnownTypeAttribute类来装饰WCF服务中的DataContract,以指定枚举类型为System.Web.Security.MembershipCreateStatus我不知道您的环境的详细信息,但一般情况下除非您同时控制在WCF服务和消费客户端,我会仔细研究支持要求以及将来更改枚举的可能性,从而导致使用此枚举的客户端出现向后兼容性问题。还要考虑非.NET客户端可以使用您的WCF服务的情况。在这种情况下,您需要考虑使用System.Web.Security.MembershipCreateStatus枚举是否是一个好主意,而不是实现您自己的成员创建状态。 Here是StackOverflow上的另一个问题,对此主题进行了很好的讨论。

例如,请参阅下面的代码

[ServiceContract]
public interface IMembershipService
{
    [OperationContract]
    CreateMemberResponse CreateMember(ApplicationUser userToCreate);
}

[DataContract]
[KnownType(typeof(System.Web.Security.MembershipCreateStatus))]
public class CreateMemberResponse
{
    [DataMember]
    public MembershipCreateStatus Status { get; set; }
}

[DataContract]
public class ApplicationUser
{
    public bool ReturnSuccess { get; set; }

    public ApplicationUser()
    {
        ReturnSuccess = true;
    }
}

您可以按如下方式编写针对此服务的测试,此测试将成功。

[TestClass]
public class MembershipStatusInvocationTests
{
    [TestMethod]
    public void CreateMemberShouldReturnMembershipCreateStatusEnum()
    {
        var client = new MembershipServiceClient();
        var response = client.CreateMember(new ApplicationUser {ReturnSuccess = true});

       Assert.IsInstanceOfType(response.Status, typeof(System.Web.Security.MembershipCreateStatus));
    }
}

有关KnownTypeAttribute课程的详情,请参阅here