2011-08-29 75 views
0

如何使用查询字符串创建动态响应?WCF动态响应格式

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

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

您能向我们解释您的示例代码吗?它工作吗?如果不是,它是如何失败的? –

+0

它失败!我想知道用户如何传递他们想要的返回类型,并且只显示它。 – James

+0

它只会返回肥皂请求。 – James

回答

3

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

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

+0

的确如此。我已经开始使用查询字符串来支持多个请求。但是,我想看看是否有另一种方式。它可以用多个端点完成。我希望用户指定返回格式。 – James

+0

那么你需要支持一个场景,比如,客户端以JSON格式发送请求,但是需要SOAP响应?我很高兴能通过比我更聪明的大脑纠正,但我不相信WCF支持这种情况。你运行的是哪种客户端,可以处理请求和响应的不同消息格式? –

+0

我认为它可能只是没有人试过。我希望用户控制他们的响应格式。为什么它们应该受到限制?如果它们有限,那意味着我的设计有限制。我会在这个项目上多花一天时间。感谢您的答复。 – James

2

您不能在同一个端点中使用SOAP和JSON(或POX - “普通旧式XML”)响应。 SOAP是一个协议,它规定了请求和响应如何格式化 - 根据SOAP信封版本,SOAP寻址标头(或不存在它们)等。如果端点“说话”SOAP,则它不能说“肥皂”。

要在JSON和XML(即POX)之间进行切换,您可以在操作中指定您希望在单个端点返回时使用的格式。端点需要无SOAP(即其绑定必须具有MessageVersion.None,例如WebHttpBinding),并且已应用Web行为(通常是配置中定义的WebHttpBehavior<webHttp/>)。这样的端点通常被称为WCF WebHttp端点或(相当有误称的)REST端点。

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

+0

谢谢,所以有没有办法让用户定义响应格式? – James

+1

是的,他们可以。如果在POX和JSON之间,可以通过像你这样的参数完成。但是如果它在POX和SOAP之间,那么不是通过参数,而是通过端点地址(POX的一个端点,一个用于SOAP)。 – carlosfigueira