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");
                }
        }
    }       

WCF动态响应格式

实现目标的最简单方法是使用不同的绑定创建不同的端点。您可以为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,这可能会破坏您的客户机。