首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WCF Rest服务错误处理和WebChannelFactory

WCF Rest服务错误处理和WebChannelFactory
EN

Stack Overflow用户
提问于 2012-05-04 02:04:59
回答 1查看 1.6K关注 0票数 5

根据我的理解,以下代码应该正确地抛出来自WCF Rest服务的自定义错误:

代码语言:javascript
复制
[DataContract(Namespace = "")]
public class ErrorHandler
{
    [DataMember]
    public int errorCode { get; set; }

    [DataMember]
    public string errorMessage { get; set; }
} // End of ErrorHandler

public class Implementation : ISomeInterface
{
    public string SomeMethod()
    {
        throw new WebFaultException<ErrorHandler>(new ErrorHandler()
        {
            errorCode = 5,
            errorMessage = "Something failed"
        }, System.Net.HttpStatusCode.BadRequest);
    }
}

在Fiddler中,这似乎是可行的,我得到了以下原始数据:

代码语言:javascript
复制
HTTP/1.1 400 Bad Request
Cache-Control: private
Content-Length: 145
Content-Type: application/xml; charset=utf-8
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
Set-Cookie: ASP.NET_SessionId=gwsy212sbjfxdfzslgyrmli1; path=/; HttpOnly
X-Powered-By: ASP.NET
Date: Thu, 03 May 2012 17:49:14 GMT

<ErrorHandler xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><errorCode>5</errorCode><errorMessage>Something failed</errorMessage></ErrorHandler>

但现在在我的客户端,我有以下代码:

代码语言:javascript
复制
WebChannelFactory<ISomeInterface> client = new WebChannelFactory<ISomeInterface>(new Uri(targetHost));

ISomeInterface someInterface = client.CreateChannel();
try
{
  var result = someInterface.SomeMethod();
}
catch(Exception ex)
{
   // Try to examine the ErrorHandler to get additional details.
}

现在,当代码运行时,它命中了catch,它是一个System.ServiceModel.ProtocolException,并显示消息“the remote server returned an unexpected response:(400) Bad Request.”。在这一点上,我似乎没有办法查看ErrorHandler的详细信息。有没有人碰到过这个?有没有办法在这一点上获得ErrorHander的详细信息?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-04 02:35:57

WebChannelFactoryChannelFactory只会向您透露通用CommunicationException。您将需要使用IClientMessageInspector行为或依靠WebRequest来返回实际的错误。

有关IClientMessageInspector方法-请参阅this blog entry中的注释。

对于WebRequest方法,您可以执行以下操作来捕获WebException

代码语言:javascript
复制
try { }
catch (Exception ex)
{
    if (ex.GetType().IsAssignableFrom(typeof(WebException)))
    {
        WebException webEx = ex as WebException;
        if (webEx.Status == WebExceptionStatus.ProtocolError)
        {
            using (StreamReader exResponseReader = new StreamReader(webEx.Response.GetResponseStream()))
            {
                string exceptionMessage = exResponseReader.ReadToEnd();
                Trace.TraceInformation("Internal Error: {0}", exceptionMessage);
            }
        }
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10436951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档