私はJSON入力を受け入れ、JSON出力を返すC#での典型的なWCF RESTサービスを持って動作しません:WCF RESTサービス:JSONとWebInvokeと多型が正しく
[ServiceContract]
public class WCFService
{
[WebInvoke(Method = "POST", UriTemplate = "register", ResponseFormat = WebMessageFormat.Json)]
public BasicResponse RegisterNewUser(UserDTO newUser)
{
return new BasicResponse()
{ status = "ERR_USER_NAME" };
}
}
public class BasicResponse
{
public string status { get; set; }
}
public class UserDTO
{
public string username { get; set; }
public string authCode { get; set; }
}
予想通り、この作品が、私がしたいです通常の実行の場合やエラーが発生した場合には、別のオブジェクトを返す。私は基本的な応答クラスといくつかの継承者を作成しました。今WCF JSONシリアライザがクラッシュし、「400不正な要求」を生成する:
[ServiceContract]
public class WCFService
{
[WebInvoke(Method = "POST", UriTemplate = "register",
ResponseFormat = WebMessageFormat.Json)]
public BasicResponse RegisterNewUser(UserDTO newUser)
{
return new ErrorResponse()
{
status = "ERR_USER_NAME",
errorMsg = "Invalid user name."
};
}
}
public class BasicResponse
{
public string status { get; set; }
}
public class ErrorResponse : BasicResponse
{
public string errorMsg { get; set; }
}
public class UserDTO
{
public string username { get; set; }
public string authCode { get; set; }
}
私は成功せず[KnownType(typeof(ErrorResponse))]
と[ServiceKnownType(typeof(ErrorResponse))]
属性を適用しようとしましたが。多形性をサポートしていることを示すDataContractJsonSerializer
のバグのようです。
私のWCF RESTサービスがWebServiceHostFactoryを使用しています。私のWeb.configファイルで
<%@ ServiceHost Language="C#" Debug="true"
Service="WCFService"
CodeBehind="CryptoCharService.svc.cs"
Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>
私は、標準のHTTPエンドポイントを持っている:
<system.serviceModel>
<standardEndpoints>
<webHttpEndpoint>
<standardEndpoint helpEnabled="true" defaultOutgoingResponseFormat="Json" />
</webHttpEndpoint>
</standardEndpoints>
</system.serviceModel>
あなたは、これは修正可能だと思いますか?私は回避策を知っています(文字列を返し、手動で出力をシリアル化する)が、なぜこれが機能しないのですか?
これらのご提案ありがとうございます。 WCFのコンセプトでは[DataContract]と[DataMember]を使うべきだとわかっていましたが、何時間もの実験の後、DataContractJsonSerializerはこれらの属性を完全に無視してコードから削除しました。あなたのコードは役に立たない。シリアライザはまだクラッシュし、結果は "400 Bad Request"です。シリアライザによってスローされた例外をどのように見ることができますか? –