WCF动态响应格式
本文关键字:格式 响应 动态 WCF | 更新日期: 2023-09-27 18:07:12
如何使用查询字符串创建动态响应?
我想根据用户在消息体中指定的内容动态输出响应格式。
例如,如果用户输入"json","xml","soap",它将返回各自的格式。谢谢,提前说。
public interface IReg
{
[OperationContract]
[WebInvoke]
MemberBasic Login(string uniqueID, string password, string returnFormat);
}
[DataContract(Namespace = "", IsReference=false)]
[Serializable()]
public class MemberBasic
{
#region Properties
[DataMember]
public DateTime LastModified
{
get;
set;
}
}
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public sealed class RWS : IReg
{
public MemberBasic Login(string uniqueID, string password, string returnFormat)
{
MemberBasic result = new MemberBasic();
setReturnFormat(returnFormat);
return result;
}
}
private static void Init(string returnFormat)
{
var response = WebOperationContext.Current.OutgoingResponse;
response.Headers.Add("cache-Control", "no-cache");
response.Headers.Add("Last-Modified", string.Format("{0:r}", DateTime.Today));
switch (returnFormat)
{
case "xml":
{
WebOperationContext.Current.OutgoingResponse.Format = WebMessageFormat.Xml;
WebOperationContext.Current.OutgoingRequest.Headers.Add(System.Net.HttpRequestHeader.ContentType, "application/json");
} break;
case "json":
{
WebOperationContext.Current.OutgoingResponse.Format = WebMessageFormat.Json;
} break;
default:
{
throw new ArgumentException("Return Format unrecognized; cannot complete request.",
"returnFormat");
}
}
}
实现目标的最简单方法是使用不同的绑定创建不同的端点。您可以为POX、SOAP和JSON创建一个。它们可以共享契约和实现,但是WCF/configuration负责管理请求/响应格式。
将SOAP指定为响应格式没有多大意义,因为在WCF中,这意味着请求也必须是SOAP请求。
您不能在同一个端点中同时拥有SOAP和JSON(或POX—"普通的旧XML")响应。SOAP是一种协议,它规定了请求和响应需要如何格式化——根据SOAP信封版本、SOAP寻址头(或不寻址头)等。如果一个端点与SOAP"对话",它就不能与"非SOAP"对话。
要在JSON和XML(即POX)之间进行更改,您可以在操作中指定您希望在单个端点的返回中使用的格式。端点需要是无soap的(即,它的绑定必须具有MessageVersion.None
,例如WebHttpBinding
),并且具有应用于它的Web行为(通常是WebHttpBehavior
,或者如果在配置中定义了<webHttp/>
)。这些端点通常被称为WCF WebHttp端点或(相当错误的命名)REST端点。
您的示例是为Web端点做到这一点的一种方法,尽管如果将响应格式设置为XML,则将内容类型设置为application/json
,这可能会破坏您的客户机。