相关疑难解决方法(0)

如何使用非OK http代码使自定义WCF错误处理程序返回JSON响应?

我正在使用WCF和WebHttpBinding实现RESTful Web服务.目前我正在处理错误处理逻辑,实现自定义错误处理程序(IErrorHandler); 目的是让它捕获操作抛出的任何未捕获的异常,然后返回一个JSON错误对象(包括说错误代码和错误消息 - 例如{"errorCode":123,"errorMessage":"bla"})回到浏览器用户以及一个HTTP代码,例如BadRequest,InteralServerError或其他任何东西(除了'确定'以外的任何东西).这是我在错误处理程序的ProvideFault方法中使用的代码:

fault = Message.CreateMessage(version, "", errorObject, new DataContractJsonSerializer(typeof(ErrorMessage)));
var wbf = new WebBodyFormatMessageProperty(WebContentFormat.Json);
fault.Properties.Add(WebBodyFormatMessageProperty.Name, wbf);
var rmp = new HttpResponseMessageProperty();
rmp.StatusCode = System.Net.HttpStatusCode.InternalServerError;
rmp.Headers.Add(HttpRequestHeader.ContentType, "application/json");
fault.Properties.Add(HttpResponseMessageProperty.Name, rmp);
Run Code Online (Sandbox Code Playgroud)

- >返回Content-Type:application/json,但状态代码为'OK'而不是'InternalServerError'.

fault = Message.CreateMessage(version, "", errorObject, new DataContractJsonSerializer(typeof(ErrorMessage)));
var wbf = new WebBodyFormatMessageProperty(WebContentFormat.Json);
fault.Properties.Add(WebBodyFormatMessageProperty.Name, wbf);
var rmp = new HttpResponseMessageProperty();
rmp.StatusCode = System.Net.HttpStatusCode.InternalServerError;
//rmp.Headers.Add(HttpRequestHeader.ContentType, "application/json");
fault.Properties.Add(HttpResponseMessageProperty.Name, rmp);
Run Code Online (Sandbox Code Playgroud)

- >返回正确的状态代码,但内容类型现在是XML.

fault = Message.CreateMessage(version, "", errorObject, new DataContractJsonSerializer(typeof(ErrorMessage)));
var wbf = new WebBodyFormatMessageProperty(WebContentFormat.Json);
fault.Properties.Add(WebBodyFormatMessageProperty.Name, wbf);

var response = WebOperationContext.Current.OutgoingResponse;
response.ContentType …
Run Code Online (Sandbox Code Playgroud)

.net rest error-handling wcf web-services

35
推荐指数
4
解决办法
2万
查看次数

WCF IErrorHandler将FaultException返回到SOAP和WebHttpException到POX和Json端点

我有一组使用IErrorHandler包装异常的SOAP Web服务,具体来说:

public sealed class ErrorHandler : IErrorHandler
{
    public bool HandleError(Exception error)
    {
        return true;
    }

    public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
    {
        // don't wrap existing fault exceptions
        if ((error is FaultException)) return;

        // our basic service fault
        var businessFault = new BusinessFault { FaultMessage = error.Message, FaultReference = "Internal" };

        // Resource based faultReason
        var faultReason = new FaultReason(Properties.Resources.BusinessFaultReason);
        var faultcode = FaultCodeFactory.CreateVersionAwareSenderFaultCode(InternalFaultCodes.BusinessFailure.ToString(), Service.Namespace);

        var faultException = new FaultException<BusinessFault>(
            businessFault,
            faultReason,
            faultcode);

        // Create …
Run Code Online (Sandbox Code Playgroud)

rest wcf soap

17
推荐指数
1
解决办法
2810
查看次数

如何拦截WCF故障并返回自定义响应?

考虑以下非常基本的WCF服务实现:

public enum TransactionStatus 
{
    Success = 0,
    Error = 1
}

public class TransactionResponse
{
    public TransactionStatus Status { get; set; }
    public string Message { get; set; }
}


[ServiceContract]
[XmlSerializerFormat]
public interface ITestService
{
    [OperationContract]
    TransactionResponse DoSomething(string data);
}   

public class TestService : ITestService
{
    public TransactionResponse DoSomething(string data)
    {
        var result = ProcessData(data); // may throw InvalidOperationException
        return new TransactionResponse() 
        {
            Status = TransactionStatus.Success,
            Message = result                
        };            
    }

    private string ProcessData(string data) 
    {
        if (data …
Run Code Online (Sandbox Code Playgroud)

wcf exception-handling

5
推荐指数
1
解决办法
4098
查看次数