gpt4 book ai didi

c# - WCF 休息服务 : WebInvoke with JSON and polymorphism does not work correctly

转载 作者:行者123 更新时间:2023-11-30 17:14:37 25 4
gpt4 key购买 nike

我在 C# 中有一个典型的 WCF REST 服务,它接受 JSON 输入并返回 JSON 输出:

[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 Bad Request”:

[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:

<%@ ServiceHost Language="C#" Debug="true" 
Service="WCFService"
CodeBehind="CryptoCharService.svc.cs"
Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>

在我的 Web.config 中,我有标准的 HTTP 端点:

<system.serviceModel>
<standardEndpoints>
<webHttpEndpoint>
<standardEndpoint helpEnabled="true" defaultOutgoingResponseFormat="Json" />
</webHttpEndpoint>
</standardEndpoints>
</system.serviceModel>

您认为这可以解决吗?我知道一个解决方法(返回字符串并手动序列化输出)但为什么这不起作用?

最佳答案

我找到了一种方法来部分克服所描述的问题。当我需要返回一个正常值(例如 BasicResponse)时,我只是返回它(我的服务返回 BasicResponse 对象)。当我需要返回错误响应时,我将其作为 WebFaultException 返回,它也被序列化为 JSON 并作为 HTTP 响应发送到 WCF 服务:

throw new WebFaultException<ErrorResponse>(
new ErrorResponse() { errorMsg = "Error occured!" },
HttpStatusCode.NotFound);

现在我可以通过此 WebFaultException 将预期结果作为正常方法返回值发送,并在出现错误时发送任何异常结果。

关于c# - WCF 休息服务 : WebInvoke with JSON and polymorphism does not work correctly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8568269/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com