我有这样的服务合同:
[WebGet(UriTemplate = "getdata?key={key}&format={format}")]
Event[] GetIncidentsXml(string key, string format);
在代码中,我正在切换响应格式,如下所示:
var selectedFormat = ParseWebMessageFormat(format);
WebOperationContext.Current.OutgoingResponse.Format = selectedFormat;
(ParseWebMessageFormat 是一种封装 Enum 类型解析的方法)
这部分按预期工作,我根据传递的参数获得 XML 或 JSON。
当我抛出异常时,它就会崩溃。如果传入的(API)密钥无效,我正在这样做:
var exception = new ServiceResponse
{
State = "fail",
ErrorCode = new ErrorDetail { Code = "100", Msg = "Invalid Key" }
};
throw new WebProtocolException(HttpStatusCode.BadRequest, "Invalid Key.", exception, null);
抛出异常时,返回类型始终为XML:
<ServiceResponse xmlns="http://schemas.datacontract.org/2004/07/IBI.ATIS.Web.ServiceExceptions" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<ErrorCode>
<Code>100</Code>
<Msg>Invalid Key</Msg>
</ErrorCode>
<State>fail</State>
</ServiceResponse>
返回类型更改是服务方法中的第一行代码,因此在抛出异常之前发生。
我知道我可以根据请求格式将 WCF 设置为返回类型,但必须使用通过查询字符串传入的类型。
自动消息类型在配置中关闭:
<standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="false" />