私はこのようなサービス契約を結んでいます:
[WebGet(UriTemplate = "getdata?key={key}&format={format}")]
Event[] GetIncidentsXml(string key, string format);
コードでは、次のように応答形式を切り替えています。
var selectedFormat = ParseWebMessageFormat(format);
WebOperationContext.Current.OutgoingResponse.Format = selectedFormat;
(ParseWebMessageFormatは、型の列挙型解析をまとめるメソッドです)
この部分は期待どおりに機能し、渡されたパラメーターに応じて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を設定できることは知っていますが、クエリ文字列を介して渡された型を使用する必要があります。
自動メッセージタイプはconfigでオフになっています:
<standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="false" />