ServiceContractAttribute 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
指示接口或类在 Windows Communication Foundation (WCF) 应用程序中定义服务协定。
public ref class ServiceContractAttribute sealed : Attribute
[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Interface, AllowMultiple=false, Inherited=false)]
public sealed class ServiceContractAttribute : Attribute
[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Interface, Inherited=false)]
public sealed class ServiceContractAttribute : Attribute
[<System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Interface, AllowMultiple=false, Inherited=false)>]
type ServiceContractAttribute = class
inherit Attribute
[<System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Interface, Inherited=false)>]
type ServiceContractAttribute = class
inherit Attribute
Public NotInheritable Class ServiceContractAttribute
Inherits Attribute
- 继承
- 属性
示例
下面的代码示例演示如何对接口应用 ServiceContractAttribute 以使用一个由 OperationContractAttribute 指示的服务方法来定义服务协定。 在这种情况下,所有消息的绑定需要的保护级别为 ProtectionLevel.EncryptAndSign。
然后,该代码示例将在 SampleService
类上实现该协定。
using System;
using System.Collections.Generic;
using System.Net.Security;
using System.ServiceModel;
using System.Text;
namespace Microsoft.WCF.Documentation
{
[ServiceContract(
Namespace="http://microsoft.wcf.documentation",
Name="SampleService",
ProtectionLevel=ProtectionLevel.EncryptAndSign
)]
public interface ISampleService{
[OperationContract]
string SampleMethod(string msg);
}
class SampleService : ISampleService
{
#region ISampleService Members
public string SampleMethod(string msg)
{
return "The service greets you: " + msg;
}
#endregion
}
}
Imports System.Collections.Generic
Imports System.Net.Security
Imports System.ServiceModel
Imports System.Text
Namespace Microsoft.WCF.Documentation
<ServiceContract(Namespace:="http://microsoft.wcf.documentation", Name:="SampleService", ProtectionLevel:=ProtectionLevel.EncryptAndSign)> _
Public Interface ISampleService
<OperationContract> _
Function SampleMethod(ByVal msg As String) As String
End Interface
Friend Class SampleService
Implements ISampleService
#Region "ISampleService Members"
Public Function SampleMethod(ByVal msg As String) As String Implements ISampleService.SampleMethod
Return "The service greets you: " & msg
End Function
#End Region
End Class
End Namespace
下面的代码示例演示了上述服务(创建一个终结点)的简单配置文件。
<configuration>
<system.serviceModel>
<services>
<service
name="Microsoft.WCF.Documentation.SampleService"
behaviorConfiguration="mex"
>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8080/SampleService"/>
</baseAddresses>
</host>
<endpoint
address=""
binding="wsHttpBinding"
contract="Microsoft.WCF.Documentation.ISampleService"
/>
<endpoint
address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange"
/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="mex">
<serviceMetadata httpGetEnabled="true" httpGetUrl=""/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
下面的代码示例演示调用上述 SampleService
的简单客户端。
using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
public class Client
{
public static void Main()
{
// Picks up configuration from the config file.
SampleServiceClient wcfClient = new SampleServiceClient();
try
{
// Making calls.
Console.WriteLine("Enter the greeting to send: ");
string greeting = Console.ReadLine();
Console.WriteLine("The service responded: " + wcfClient.SampleMethod(greeting));
Console.WriteLine("Press ENTER to exit:");
Console.ReadLine();
// Done with service.
wcfClient.Close();
Console.WriteLine("Done!");
}
catch (TimeoutException timeProblem)
{
Console.WriteLine("The service operation timed out. " + timeProblem.Message);
wcfClient.Abort();
Console.Read();
}
catch(CommunicationException commProblem)
{
Console.WriteLine("There was a communication problem. " + commProblem.Message);
wcfClient.Abort();
Console.Read();
}
}
}
Imports System.ServiceModel
Imports System.ServiceModel.Channels
Public Class Client
Public Shared Sub Main()
' Picks up configuration from the config file.
Dim wcfClient As New SampleServiceClient()
Try
' Making calls.
Console.WriteLine("Enter the greeting to send: ")
Dim greeting = Console.ReadLine()
Console.WriteLine("The service responded: " & wcfClient.SampleMethod(greeting))
Console.WriteLine("Press ENTER to exit:")
Console.ReadLine()
' Done with service.
wcfClient.Close()
Console.WriteLine("Done!")
Catch timeProblem As TimeoutException
Console.WriteLine("The service operation timed out. " & timeProblem.Message)
wcfClient.Abort()
Console.Read()
Catch commProblem As CommunicationException
Console.WriteLine("There was a communication problem. " & commProblem.Message)
wcfClient.Abort()
Console.Read()
End Try
End Sub
End Class
注解
使用接口(或类)上的 ServiceContractAttribute 属性定义服务协定。 然后使用一个或多个类(或接口)方法中的 OperationContractAttribute 属性定义协定的服务操作。 当服务协定实现并与 绑定 和 EndpointAddress 对象组合时,服务协定将公开供客户端使用。 有关使用简单示例的过程的概述,请参阅入门教程。 有关创建服务协定的详细信息,请参阅 设计和实现服务。
此信息由 ServiceContractAttribute 表示,其接口与 Web 服务描述语言 (WSDL) <portType>
元素松散相关。 服务协定在服务端用于指定服务终结点向调用方公开的内容。 它也可以在客户端使用,以指定客户端与终结点通信的协定,如果是双工协定,则用于指定客户端必须实现的回调协定(使用 CallbackContract 属性)以参与双工对话。
备注
使用 ServiceContractAttribute 修饰的接口或类还必须至少拥有一个用 OperationContractAttribute 属性标记的方法以公开任意功能。 有关使用这两个属性定义和实现服务的最简单用法的代码示例,请参见“示例”部分。
使用 ServiceContractAttribute 属性修改服务协定。
ConfigurationName 属性指定要使用的配置文件中的服务元素的名称。
SessionMode 属性指定协定是否需要支持会话的绑定。
CallbackContract 属性指定双向(双工)对话中的返回协定。
HasProtectionLevel 和 ProtectionLevel 属性指示是否所有支持协定的消息都具有一个显式 ProtectionLevel 值,如果有,处于什么级别。
服务实现服务协定,此协定表示服务类型支持的数据交换。 服务类可以实现服务协定(通过实现以 ServiceContractAttribute 标记的接口,该接口具有以 OperationContractAttribute 标记的方法),或者也可以使用 ServiceContractAttribute 标记并将 OperationContractAttribute 属性应用到它自己的方法中。 (如果类实现标记 ServiceContractAttribute的接口,则不能使用 ServiceContractAttribute.) 方法标记服务类型的服务类型 OperationContractAttribute ,这些方法被视为由服务类型本身指定的默认服务协定的一部分。 有关服务操作的详细信息,请参见 OperationContractAttribute。
默认情况下,Name 和 Namespace 属性分别是协定类型的名称和 http://tempuri.org
,且 ProtectionLevel 为 ProtectionLevel.None。 建议服务协定使用这些属性显式设置其名称、命名空间和保护级别。 这样做可以实现两个目的。 首先,它将生成一个并不直接与托管的类型信息连接的协定,从而使你可以重构托管代码和命名空间而不破坏协定,这是因为协定使用 WSDL 表示。 其次,显式要求协定本身具有特定保护级别将使运行时能够验证绑定配置是否支持该安全级别,从而防止因配置不当而公开敏感信息。 有关保护级别的详细信息,请参阅 了解保护级别。
若要公开供客户端应用程序使用的服务,请创建一个主机应用程序,将服务终结点注册到 Windows Communication Foundation (WCF) 。 可以在控制台应用程序、Windows服务应用程序、ASP.NET 应用程序、Windows 窗体应用程序或任何其他应用程序域中使用Windows激活服务 (WAS) 托管 WCF 服务。
在 WAS 中承载与创建 ASP.NET 应用程序非常类似。 有关详细信息,请参阅 如何:在 IIS 中托管 WCF 服务。
客户端既可以使用服务协定接口(使用 ServiceContractAttribute 标记的接口)创建服务的信道,也可以使用客户端对象(这些对象将服务协定接口的类型信息与 ClientBase<TChannel> 类相结合)与您的服务通信。 有关服务客户端通道的详细信息,请参阅 ChannelFactory<TChannel> 类和 WCF 客户端概述。
使用 ServiceContractAttribute 类或接口从另一个 ServiceContractAttribute 类或接口继承将会扩展其父协定。 例如,如果 IChildContract
接口使用 ServiceContractAttribute 标记并且是从另一个服务协定接口 IParentContract
继承的,则 IChildContract
服务协定将包含 IParentContract
和 IChildContract
的方法。 扩展协定(无论在类或接口上)与扩展托管类和接口非常类似。
创建服务最灵活的方法是先定义服务协定接口,然后再让服务类实现该接口。 (如果必须实现由其他服务定义的服务协定,) 直接生成服务,方法是在 ServiceContractAttribute 服务仅公开一个协定 (但该协定可由多个终结点) 公开时使用 OperationContractAttribute 其方法来直接生成服务。
使用 CallbackContract 属性指示另一个服务协定,当与原始服务协定绑定时,可以单独定义可以以两种方式流动的消息交换。 有关详细信息,请参阅 CallbackContract。
构造函数
ServiceContractAttribute() |
初始化 ServiceContractAttribute 类的新实例。 |
属性
CallbackContract |
获取或设置当协定为双工协定时的回调协定类型。 |
ConfigurationName |
获取或设置用于查找应用程序配置文件中的服务的名称。 |
HasProtectionLevel |
获取一个值,该值指示是否对成员分配保护级别。 |
Name |
获取或设置 Web 服务描述语言 (WSDL) 中的 |
Namespace |
获取或设置 Web 服务描述语言 (WSDL) 中的 |
ProtectionLevel |
指定协定的绑定是否必须支持 ProtectionLevel 属性的值。 |
SessionMode |
获取或设置是否允许、不允许或要求会话。 |
TypeId |
在派生类中实现时,获取此 Attribute 的唯一标识符。 (继承自 Attribute) |
方法
Equals(Object) |
返回一个值,该值指示此实例是否与指定的对象相等。 (继承自 Attribute) |
GetHashCode() |
返回此实例的哈希代码。 (继承自 Attribute) |
GetType() |
获取当前实例的 Type。 (继承自 Object) |
IsDefaultAttribute() |
在派生类中重写时,指示此实例的值是否是派生类的默认值。 (继承自 Attribute) |
Match(Object) |
当在派生类中重写时,返回一个指示此实例是否等于指定对象的值。 (继承自 Attribute) |
MemberwiseClone() |
创建当前 Object 的浅表副本。 (继承自 Object) |
ToString() |
返回表示当前对象的字符串。 (继承自 Object) |
显式接口实现
_Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr) |
将一组名称映射为对应的一组调度标识符。 (继承自 Attribute) |
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) |
检索对象的类型信息,然后可以使用该信息获取接口的类型信息。 (继承自 Attribute) |
_Attribute.GetTypeInfoCount(UInt32) |
检索对象提供的类型信息接口的数量(0 或 1)。 (继承自 Attribute) |
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) |
提供对某一对象公开的属性和方法的访问。 (继承自 Attribute) |