我有一个WCF服务方法,它将MembershipCreateStatus
(System.Web.Security
)发送回调用方法。当我查看服务定义时,它已将枚举重新创建为MyProject.MyWebService.MembershipCreateStatus
的类型,因此它本质上是一个完全不同的对象。
有没有一种方法可以告诉服务定义使用System.Web.Security
类,即使它是在WCF服务中?
答案 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