WCF服务正在创建单独的代理类

本文关键字:代理 单独 创建 服务 WCF | 更新日期: 2023-09-27 18:00:06

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

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

WCF服务正在创建单独的代理类

您可以。您需要使用KnownTypeAttribute类来修饰WCF服务中的DataContract,以指定枚举的类型为System.Web.Security.MembershipCreateStatus。我不知道您的环境的详细信息,但通常情况下,除非您同时控制WCF服务和消费客户端,我会仔细研究支持需求以及未来对枚举进行更改的可能性,这些更改会导致与使用此枚举的客户端的向后兼容性问题。还需要考虑一个非.NET客户端可能使用WCF服务的场景。在这种情况下,您需要考虑使用System.Web.Security.MembershipCreateStatus枚举与实现自己的成员创建状态相比是否是一个好主意。下面是关于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类的更多信息,请参阅此处