如何在不使用查询字符串的情况下创建动态响应?
我想根据邮件正文中用户的具体内容动态输出响应格式。
例如,如果用户输入“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 :(得分: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/>
,这可能会破坏您的客户端。