WCF服务契约-ServiceContract

本文详细介绍了WCF中的服务契约ServiceContract特性,包括其用法、属性及如何定义操作契约OperationContract。此外,还探讨了契约继承的概念以及如何通过OperationContract特性中的Action与ReplyAction属性保留原始契约名。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

服务契约ServiceContract特性能够把接口或者类公开为面向服务的契约,允许开发者使用c#语言进行编程把类似于接口这样的语法结构公开为WCF契约和服务。
//指示接口或类在应用程序中定义服务协定。
// 摘要:指示接口或类在 应用程序中定义服务协定。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, Inherited = false, AllowMultiple = false)]
public sealed class ServiceContractAttribute : Attribute
{
    // 摘要:初始化 System.ServiceModel.ServiceContractAttribute 类的新实例。
    [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
    public ServiceContractAttribute();

    // 摘要:获取或设置当协定为双工协定时的回调协定类型。
    // 返回结果:指示回调协定的 System.Type。默认值为 null。
    public Type CallbackContract { get; set; }

    // 摘要:获取或设置用于查找应用程序配置文件中的服务的名称。
    // 返回结果:用于查找应用程序配置文件中的服务元素的名称。默认值是服务实现类的名称。
    // 异常:System.ArgumentNullException:该值为 Null。System.ArgumentOutOfRangeException:该值是一个空字符串。
    public string ConfigurationName { get; set; }

    // 摘要:取一个值,该值指示是否对成员分配保护级别。
    // 返回结果:如果 System.ServiceModel.ServiceContractAttribute.ProtectionLevel 属性不是 System.Net.Security.ProtectionLevel.None,则为true;否则为 false。默认值为 false。
    public bool HasProtectionLevel { get; }

    // 摘要:获取或设置 Web 服务描述语言 (WSDL) 中的 <portType> 元素的名称。
    // 返回结果:默认值为应用了 System.ServiceModel.ServiceContractAttribute 的类或接口的名称。
    // 异常:System.ArgumentNullException:该值为 Null。System.ArgumentOutOfRangeException:该值是一个空字符串。
    public string Name { get; set; }

    // 摘要:获取或设置 Web 服务描述语言 (WSDL) 中的 <portType> 元素的命名空间。
    // 返回结果:<portType> 元素的 WSDL 命名空间。默认值为“http://tempuri.org”。
    public string Namespace { get; set; }

    // 摘要:指定协定的绑定是否必须支持 System.ServiceModel.ServiceContractAttribute.ProtectionLevel属性的值。
    // 返回结果:System.Net.Security.ProtectionLevel 值之一。默认值为 System.Net.Security.ProtectionLevel.None。
    // 异常:System.ArgumentOutOfRangeException:该值不是 System.Net.Security.ProtectionLevel 值之一。
    public ProtectionLevel ProtectionLevel { get; set; }

    // 摘要:获取或设置是否允许、不允许或要求会话。
    // 返回结果:指示是否允许、不允许或要求会话的 System.ServiceModel.SessionMode。
    // 异常:System.ArgumentOutOfRangeException:该值不是 System.ServiceModel.SessionMode 值之一。
    public SessionMode SessionMode { get; set; }
}

一、方法重载
具有相同名称的方法定义不同的参数或者返回值即为方法的重载。WCF中方法的重载是通过OperationContract特性的Name 属性,为操作指定别名实现的。
//指示方法定义一个操作,该操作是 应用程序中服务协定的一部分。
// 摘要:指示方法定义一个操作,该操作是 应用程序中服务协定的一部分。
[AttributeUsage(AttributeTargets.Method)]
public sealed class OperationContractAttribute : Attribute
{
    // 摘要:初始化 System.ServiceModel.OperationContractAttribute 类的新实例。
    public OperationContractAttribute();

    // 摘要:获取或设置请求消息的 WS-Addressing 操作。
    // 返回结果:生成 WS-Addressing Action 标头时要使用的操作。
    // 异常:System.ArgumentNullException:该值为 null。
    public string Action { get; set; }

    // 摘要:指示操作是使用服务协定中的 Begin<methodName> 和 End<methodName> 方法对异步实现的。
    // 返回结果:如果 Begin<methodName> 方法与 End<methodName> 方法匹配,并且基础结构可将其视为服务接口上作为异步方法对实现的操作,则为true;否则为 false。默认值为 false。
    public bool AsyncPattern { get; set; }

    // 摘要:获取一个值,该值指示是否必须对此操作的消息进行加密和/或签名。
    // 返回结果:如果 System.ServiceModel.OperationContractAttribute.ProtectionLevel 属性设置为除System.Net.Security.ProtectionLevel.None 以外的任何值,则为 true;否则为 false。默认值为 false。
    public bool HasProtectionLevel { get; }

    // 摘要:获取或设置一个值,该值指示方法是否实现可在服务器上启动会话(如果存在会话)的操作。
    // 返回结果:如果允许操作启动服务器上的会话,则为 true;否则为 false。默认值为 true。
    public bool IsInitiating { get; set; }

    // 摘要:获取或设置一个值,该值指示操作是否返回答复消息。
    // 返回结果:如果此方法收到请求消息,但未返回任何答复消息,则为 true;否则为 false。默认值为 false。
    public bool IsOneWay { get; set; }

    // 摘要:获取或设置一个值,该值指示服务操作在发送答复消息(如果存在)后,是否会导致服务器关闭会话。
    // 返回结果:如果该操作会导致服务器关闭会话,则为 true;否则为 false。默认值为 false。
    public bool IsTerminating { get; set; }

    // 摘要:获取或设置操作的名称。
    // 返回结果:操作的名称。
    // 异常:System.ArgumentNullException:System.ServiceModel.OperationContractAttribute.Name 为 null。System.ArgumentOutOfRangeException:该值是一个空字符串。
    public string Name { get; set; }

    // 摘要:获取或设置一个值,该值指定是否必须对操作的消息进行加密和/或签名。
    // 返回结果:System.Net.Security.ProtectionLevel 值之一。默认值为 System.Net.Security.ProtectionLevel.None。
    // 异常:System.ArgumentOutOfRangeException:该值不是 System.Net.Security.ProtectionLevel 值之一。
    public ProtectionLevel ProtectionLevel { get; set; }

    // 摘要:获取或设置用于该操作答复消息的 SOAP 操作的值。
    // 返回结果:用于答复消息的 SOAP 操作的值。
    // 异常:System.ArgumentNullException:System.ServiceModel.OperationContractAttribute.ReplyAction 为 null。
    public string ReplyAction { get; set; }
}
例如:
[ServiceContract]
interface ICalculator
{
[OperationContract(Name = "AddInt")]
int Add(int arg1,int arg2);
[OperationContract(Name = "AddDouble")]
double Add(double arg1,double arg2);
}

二、契约继承
服务契约接口支持继承,ServiceContract特性(Inherited = false)却是不能继承的。
例如:
[ServiceContract]
interface ISimpleCalculator
{
[OperationContract]
int Add(int arg1,int arg2);
}
[ServiceContract]
interface IScientificCalculator : ISimpleCalculator
{
[OperationContract]
int Multiply(int arg1,int arg2);
}
当客户端导入一个服务终结点的元数据时,如果该终结点的契约属于接口层级的一部分,则生成的客户端契约将不再维持原来的层级关系。相反,它会取消层级,组成一个单独的契约,名称为终结点的契约名。这个单独的契约包含了层级中从上至下所有接口定义的操作。
[ServiceContract]
public interface IScientificCalculator
{
[OperationContract(Action = ".../ISimpleCalculator/Add",
ReplyAction = ".../ISimpleCalculator/AddResponse")]
int Add(int arg1,int arg2);
[OperationContract(Action = ".../IScientificCalculator/Multiply",
ReplyAction = ".../IScientificCalculator/MultiplyResponse")]
int Multiply(int arg1,int arg2);
}
然而,如果使用OperationContract特性中的Action 与ReplyAction属性,那么导入的接口定义仍然可以保留原来定义每个操作的契约名。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值