WCF动态响应格式

时间:2011-08-29 22:33:03

标签: c# xml wcf json rest

如何在不使用查询字符串的情况下创建动态响应?

我想根据邮件正文中用户的具体内容动态输出响应格式。

例如,如果用户输入“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");
                }
        }
    }       

2 个答案:

答案 0 :(得分:3)

执行所需操作的最简单方法是使用不同的绑定创建不同的端点。你可以拥有一个POX,SOAP和JSON。他们可以共享合同和实现,但WCF /配置负责管理请求/响应格式。

将SOAP指定为响应格式没有多大意义,因为在WCF中,这意味着请求也必须是SOAP请求。

答案 1 :(得分:2)

您不能在同一端点拥有SOAP和JSON(或POX - “普通旧XML”)响应。 SOAP是一种协议,它规定了请求和响应如何格式化 - 根据SOAP信封版本,SOAP寻址标头(或缺少它们)等。如果端点“谈”SOAP,它就不能说“非” SOAP”。

要在JSON和XML(即POX)之间进行更改,您可以在操作中指定要在单个端点的返回中使用的格式。端点需要是无SOAP的(即,其绑定必须具有MessageVersion.None,例如WebHttpBinding),并且应用了Web行为(通常是WebHttpBehavior或{如果在config中定义,则为{1}}。此类端点通常称为WCF WebHttp端点或(相当错误的)REST端点。

您的示例是Web端点的一种方法,但如果您将响应格式设置为XML,则将内容类型设置为<webHttp/>,这可能会破坏您的客户端。