Json 无法在.NET 3.5中获取REST WCF BadRequest错误消息
我在.NET3.5中开发了一个RESTWCF应用程序 为了检查无效的请求url,例如缺少参数等,我使用了一个实现IErrorHandler接口的类。在这个类中,我有一段代码,应该生成一个BadRequest错误代码和消息:Json 无法在.NET 3.5中获取REST WCF BadRequest错误消息,json,wcf,.net-3.5,fiddler,bad-request,Json,Wcf,.net 3.5,Fiddler,Bad Request,我在.NET3.5中开发了一个RESTWCF应用程序 为了检查无效的请求url,例如缺少参数等,我使用了一个实现IErrorHandler接口的类。在这个类中,我有一段代码,应该生成一个BadRequest错误代码和消息: public void ProvideFault(Exception error, MessageVersion version, ref Message fault) { ExceptionHelper.HandleException
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
ExceptionHelper.HandleException(error, Severity.Error);
StatusResponseBE statusResponseEntity = new StatusResponseBE();
statusResponseEntity.Code = STATUS_CODE_FAIL;
statusResponseEntity.Message = "Failed to perform requested operation";
statusResponseEntity.Errors = new ErrorResponseBECollection();
if (error is SerializationException || error is InvalidOperationException)
{
statusResponseEntity.Errors.Add(new ErrorResponseBE()
{
Code = EX_INVALID_REQUEST_CODE,
Description = "Invalid Request"
});
fault = Message.CreateMessage(version, string.Empty, statusResponseEntity, new DataContractJsonSerializer(typeof(StatusResponseBE)));
fault.Properties.Add(WebBodyFormatMessageProperty.Name, new WebBodyFormatMessageProperty(WebContentFormat.Json));
WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.BadRequest;
return;
}
else
{
statusResponseEntity.Errors.Add(new ErrorResponseBE()
{
Code = EX_INTERNAL_ERROR_CODE,
Description = "Internal Error"
});
fault = Message.CreateMessage(version, string.Empty, statusResponseEntity, new DataContractJsonSerializer(typeof(StatusResponseBE)));
fault.Properties.Add(WebBodyFormatMessageProperty.Name, new WebBodyFormatMessageProperty(WebContentFormat.Json));
WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.InternalServerError;
return;
}
}
但是当我使用无效的请求URL访问我的WCF服务时,我会得到一个BadReqest错误代码400,而不是响应JSON中的消息,比如代码400;消息:请求无效
HTTP/1.1 400 Bad Request
Cache-Control: private
Content-Type: application/xml; charset=utf-8
Server: Microsoft-IIS/7.0
Access-Control-Allow-Origin: *
X-AspNet-Version: 2.0.50727
Set-Cookie: ASP.NET_SessionId=xz412e35vruepr45qjrp5lyw; path=/; HttpOnly
X-Powered-By: ASP.NET
Date: Thu, 03 May 2012 14:47:15 GMT
Content-Length: 1165
<?xml version="1.0" encoding="utf-8"?><HTML><HEAD><STYLE type="text/css">#content{ FONT-SIZE: 0.7em; PADDING-BOTTOM: 2em; MARGIN-LEFT: 30px}BODY{MARGIN-TOP: 0px; MARGIN-LEFT: 0px; COLOR: #000000; FONT-FAMILY: Verdana; BACKGROUND-COLOR: white}P{MARGIN-TOP: 0px; MARGIN-BOTTOM: 12px; COLOR: #000000; FONT-FAMILY: Verdana}PRE{BORDER-RIGHT: #f0f0e0 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #f0f0e0 1px solid; MARGIN-TOP: -5px; PADDING-LEFT: 5px; FONT-SIZE: 1.2em; PADDING-BOTTOM: 5px; BORDER-LEFT: #f0f0e0 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #f0f0e0 1px solid; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e5e5cc}.heading1{MARGIN-TOP: 0px; PADDING-LEFT: 15px; FONT-WEIGHT: normal; FONT-SIZE: 26px; MARGIN-BOTTOM: 0px; PADDING-BOTTOM: 3px; MARGIN-LEFT: -30px; WIDTH: 100%; COLOR: #ffffff; PADDING-TOP: 10px; FONT-FAMILY: Tahoma; BACKGROUND-COLOR: #003366}.intro{MARGIN-LEFT: -15px}</STYLE>
<TITLE>Request Error</TITLE></HEAD><BODY>
<DIV id="content">
<P class="heading1">Request Error</P>
<BR/>
<P class="intro">The server encountered an error processing the request. See server logs for more details.</P>
<P class="intro"></P>
</DIV>
</BODY></HTML>
取而代之的是,我在Fiddler的原始标签中得到了上面的内容
知道为什么会发生这种情况吗?我能做些什么来解决它?它一直困扰着我,我已经尝试了所有的方法,但它似乎不起作用。这是WebServiceHost的问题,我假设您正在使用该服务。WCF Rest初学者工具包2中的WebServiceHost2应该允许您通过抛出WebProtocolException为错误指定自定义json负载 您可以查看此项了解更多详细信息尝试此项
var message = ex.GetOriginalMessage();
var statusCode = (ex is MyDomainException || ex.GetType().IsSubclassOf(typeof (MyDomainException)))
? HttpStatusCode.BadRequest
: HttpStatusCode.InternalServerError;
var context = WebOperationContext.Current;
if (context == null || context.IncomingRequest.ContentType.ToLower().Contains("json"))
throw new WebProtocolException(statusCode, statusCode.ToString(), message, null);
throw new WebProtocolException(statusCode, statusCode.ToString(), new XElement("Detail", message), false, null);
谢谢你的帮助,贾维。我正在为当前应用程序使用System.ServiceModel.Activation.WebScriptServiceHostFactory。当我尝试使用Microsoft.ServiceModel.Web.WebServiceHost2Factory时,我的应用程序根本没有响应。