我做了我的自定义异常,每次发生错误时都会抛出try-catch:
[Serializable]
public class CustomException : Exception
{
    public CustomException() { }

    public CustomException(string message)
        : base(message) { }

    public CustomException(string message,Exception innerException)
        : base(message,innerException) { }
}

我有两个服务,REST和SOAP.对于SOAP服务,我在抛出自定义异常时没有任何问题.
但是在REST中,我遇到了很多困难.

以下是抛出WebFaultException的方法:

public static WebFaultException RestGetFault(ServiceFaultTypes fault)
    {
        ServiceFault serviceFault = new ServiceFault();
        serviceFault.Code = (int)fault;
        serviceFault.Description = ConfigAndResourceComponent.GetResourceString(fault.ToString());
        FaultCode faultCode = new FaultCode(fault.ToString());
        FaultReasonText faultReasonText = new FaultReasonText(serviceFault.Description);
        FaultReason faultReason = new FaultReason(faultReasonText);
        WebFaultException<ServiceFault> webfaultException = new WebFaultException<ServiceFault>(serviceFault,HttpStatusCode.InternalServerError);

        throw webfaultException;
    }

ServiceFault是一个类,它有一些属性,我用它来提供我需要的所有信息.

我使用此方法在REST服务中引发异常:

public static CustomException GetFault(ServiceFaultTypes fault)
    {
        string message = fault.ToString();
        CustomException cusExcp = new CustomException(message,new Exception(message));
        throw cusExcp;
    }

REST服务示例(登录方法):

[WebInvoke(UriTemplate = "Login",Method = "POST",ResponseFormat = Webmessageformat.Json,RequestFormat = Webmessageformat.Json,BodyStyle = WebMessageBodyStyle.WrappedRequest)]
    public Session Login(ClientCredentials client,LogCredentials loginfo)
    {
        try
        {
            // Login process
            return copied;
        }
        catch (Logicclass.CustomException ex)
        {
            Logicclass.RestGetFault(Logicclass.EnumComponent.GetServiceFaultTypes(ex.Message));
            throw ex;
        }
    }

MVC部分:

控制器:

[HttpPost]
    public ActionResult Login(LoginCredentials loginfo)
    {
        try
        {
            string param = "{\"client\":" + JSonHelper.Serialize<ClientAuthentication>(new ClientAuthentication() { SessionID = Singleton.ClientSessionID })
                           + ",\"loginfo\":" + JSonHelper.Serialize<LoginCredentials>(loginfo) + "}";

            string jsonresult = ServiceCaller.Invoke(Utility.ConstructrestURL("Authenticate/Login"),param,"POST","application/json");
            UserSessionDTO response = JSonHelper.Deserialize<UserSessionDTO>(jsonresult);

        }
        catch (Exception ex)
        {
            return Json(new
            {
                status = ex.Message,url = string.Empty
            });
        }

        return Json(new
        {
            status = "AUTHENTICATED",url = string.IsNullOrWhiteSpace(loginfo.r) ? Url.Action("Index","Home") : loginfo.r
        });
    }

我使用ServiceCaller.Invoke调用REST API并检索响应:
ServiceCaller.cs

public class ServiceCaller
{
    public static string Invoke(string url,string parameters,string method,string contentType)
    {
        string results = string.Empty;
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(url));
        request.Method = method;
        request.ContentType = contentType;

        if (!string.IsNullOrEmpty(parameters))
        {
            byte[] byteArray = Encoding.UTF8.GetBytes(parameters);
            request.ContentLength = byteArray.Length;
            Stream dataStream = request.GetRequestStream();
            dataStream.Write(byteArray,byteArray.Length);
            dataStream.Close();
        }

        try
        {
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            if (HttpStatusCode.OK == response.StatusCode)
            {
                Stream responseStream = response.GetResponseStream();
                int length = (int)response.ContentLength;

                const int bufSizeMax = 65536;
                const int bufSizeMin = 8192;
                int bufSize = bufSizeMin;

                if (length > bufSize) bufSize = length > bufSizeMax ? bufSizeMax : length;

                byte[] buf = new byte[bufSize];
                StringBuilder sb = new StringBuilder(bufSize);

                while ((length = responseStream.Read(buf,buf.Length)) != 0)
                    sb.Append(Encoding.UTF8.GetString(buf,length));

                results = sb.ToString();
            }
            else
            {
                results = "Failed Response : " + response.StatusCode;
            }
        }
        catch (Exception exception)
        {
            throw exception;
        }

        return results;
    }
}

我期待REST服务在客户端返回:

但最终,它总是回归:

我该怎么办?请帮忙.

编辑

以下是调用soap服务时的示例响应:

[FaultException: InvalidLogin]
   System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg,IMessage retMsg) +9441823

你看到“InvalidLogin”吗?这就是我想在REST服务的响应中看到的.
REST的示例响应:

[WebException: The Remote Server returned an error: (500) Internal Server Error.]
   System.Net.HttpWebRequest.GetResponse() +6115971

我抛出一个WebFaultException,但我收到一个WebException.
如果我无法在REST上获取确切的错误消息,我将使用SOAP.
谢谢你的回答.

解决方法

使用HttpWebRequest(或Javascript客户端)时,您的自定义异常对它们没有意义.只是Http错误代码(如500内部服务器错误)和响应内容中的数据.

所以你必须自己处理异常.例如,如果捕获WebException,则可以根据服务器配置读取Xml或Json格式的内容(错误消息).

catch (WebException ex)
{
    var error = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd();
    //Parse your error string & do something
}

c# – 如何处理WebFaultException以返回CustomException?的更多相关文章

  1. 保护MY REST API仅用于MY IOS APP

    我在Laravel中设计一个RESTAPI,用于我的ios应用程序.目前我被困在以下几点:如何保护我的RESTAPI只允许访问我的ios应用程序?听起来我需要通过向我的IOSAPP授予一个私钥来将类似于HMAC方法的内容合并到我的IOSAPP代码中.当从iosapp中运行请求时,我传递带有私钥和其他数据的哈希,然后当在服务器上收到请求时,我通过重新计算哈希来检测请求是否来自应用程序内的用户.我不知道这是否安全&我会认为不是吗?

  2. REST API iOS开发

    我将RestKitAPI设置到我的应用程序有很多麻烦.我想知道有没有其他好的API来制作RESTful应用程序?

  3. 泛型 – Swift相当于MIN和MAX宏

    在C/Objective-C中,可以使用MIN和MAX宏找到两个数字之间的最小值和最大值。Swift不支持宏,似乎在语言/基础库中没有等价物。应该有一个定制的解决方案,也许基于类似这样的one?min和max已经在Swift中定义:看到这个伟大的写在documented&undocumentedbuilt-infunctionsinSwift。

  4. 在Swift中调用REST API

    我试图使用Swift对RESTAPI进行GET调用,并试图遵循许多教程,但不能弄清楚。或者是因为我不知道如何将所有的Obj-C翻译成Swift,或者因为一半的方法n’都被弃用。有谁知道如何进行调用,并解析返回的JSON数据?

  5. android – 如何仅限授权客户端访问我的REST API?

    题我设计的RESTAPI将用于iOS和Android应用程序,以及将来可能用于Web和其他移动客户端.如何将我的整个API仅限制为我想要访问的客户端?我想阻止第三方访问我的API以注册用户,甚至无需通过授权应用程序登录.目前的想法我可以为每个客户端提供我想要授权的密钥,但是如何防止从我的应用程序的源代码中提取此密钥?

  6. 在Android上同步SQL数据库与REST远程服务器的最佳实践

    编辑:例如,采用方法2,重写的ContentProvider#bulkInsert使用数据库事务可以大大加快批量插入操作:见thisquestion.解决方法最佳选择需要适当的API实现–何时应存储一些db_version.并且在更新服务器期间响应数据和操作类型–添加,更新,删除.

  7. 如何在Android上托管REST webservices?

    有没有人知道一个用Java编写的能够在Android上托管REST服务的开源Web服务器?

  8. android – Twitter OAuth Rest Api状态参数’@’符号

    我正在使用twitterrestapi,这是(https://api.twitter.com/1.1/).首先,我使用路标库生成oauth_signature.它运作良好.上传状态端点(https://api.twitter.com/1.1/statuses/upload.json)运行良好,但如果状态参数包含“@”符号,则表示无效.所以这是我的代码TwitterStatusesService.j

  9. android rest客户端不支持的媒体类型

    我尝试从android模拟器发送请求到一个安静的服务器.但我总是得到错误:415UnsupportedMediaType.客户代码:服务器的代码:解决方法问题是服务器不知道客户端请求的媒体类型.在客户端代码中尝试这样的事情:request.setHeader(“Content-Type”,“application/json”);

  10. android – 解析REST API不返回客户端密钥

    我正在尝试动态创建Parse应用程序并在构建我的Android应用程序时使用这些键.TheAPI工作得很好,除了一点,它不会返回客户端密钥.我需要AndroidAPI中提到的客户端密钥:我试图徒劳地翻转旗帜.我应该怎么做才能访问客户端密钥?

随机推荐

  1. c# – (wpf)Application.Current.Resources vs FindResource

    所以,我正在使用C#中的WPF创建一个GUI.它看起来像这样:它现在还没有完成.这两行是我尝试制作一种数据表,它们在XAML中是硬编码的.现在,我正在C#中实现添加新的水果按钮功能.我在XAML中有以下样式来控制行的背景图像应该是什么样子:因此,在代码中,我为每列col0,col1和col2创建一个图像,如果我使用以下代码,它添加了一个如下所示的新行:如你所见,它不太正确……为什么一个似乎忽略了一些属性而另一个没有?

  2. c# – 绑定DataGridTemplateColumn

    似乎我已经打了个墙,试图在DataGrid上使用DataTemplates.我想要做的是使用一个模板来显示每个单元格的两行文本.但是似乎无法以任何方式绑定列.以下代码希望显示我想做的事情.注意每个列的绑定:模板列没有这样的东西,因此,这个xaml不可能工作.我注定要将整个DataTemplate复制到每个列,只是对每个副本都有不同的约束?解决方法我不完全确定你想要做什么,但如果您需要获取整行的DataContext,可以使用RelativeSource绑定来移动视觉树.像这样:

  3. c# – 学习设计模式的资源

    最近我来到了这个设计模式的概念,并对此感到非常热情.你能建议一些帮助我深入设计模式的资源吗?

  4. c# – 是否有支持嵌入HTML页面的跨操作系统GUI框架?

    我想开发一个桌面应用程序来使用跨系统,是否有一个GUI框架,允许我为所有3个平台编写一次代码,并具有完全可脚本化的嵌入式Web组件?我需要它有一个API来在应用程序和网页之间进行交流.我知道C#,JavaScript和一些python.解决方法Qt有这样的事情QWebView.

  5. c# – 通过字符串在对象图中查找属性

    我试图使用任意字符串访问嵌套类结构的各个部分.给出以下(设计的)类:我想要从Person对象的一个实例的“PersonsAddress.HousePhone.Number”获取对象.目前我正在使用反思来做一些简单的递归查找,但是我希望有一些忍者有更好的想法.作为参考,这里是我开发的(crappy)方法:解决方法您可以简单地使用标准的.NETDataBinder.EvalMethod,像这样:

  6. c# – 文件下载后更新页面

    FamilyID=0a391abd-25c1-4fc0-919f-b21f31ab88b7&displaylang=en&pf=true它呈现该页面,然后使用以下元刷新标签来实际向用户提供要下载的文件:你可能需要在你的应用程序中做类似的事情.但是,如果您真的有兴趣在文件完全下载后执行某些操作,那么您的运气不佳,因为没有任何事件可以与浏览器进行通信.执行此操作的唯一方法是上传附件时使用的AJAXupload.

  7. c# – 如何在每个机器应用程序中实现单个实例?

    我必须限制我的.net4WPF应用程序,以便每台机器只能运行一次.请注意,我说每个机器,而不是每个会话.我使用一个简单的互斥体实现单实例应用程序,直到现在,但不幸的是,这样一个互斥是每个会话.有没有办法创建机器互连,还是有其他解决方案来实现每个机器应用程序的单个实例?

  8. c# – WCF和多个主机头

    我的雇主网站有多个主机名,都是同一个服务器,我们只是显示不同的皮肤来进行品牌宣传.不幸的是,在这种情况下,WCF似乎不能很好地工作.我试过overridingthedefaulthostwithacustomhostfactory.这不是一个可以接受的解决方案,因为它需要从所有主机工作,而不仅仅是1.我也看过thisblogpost,但是我无法让它工作,或者不是为了解决我的问题.我得到的错误是“这

  9. c# – ASP.NET MVC模型绑定与表单元素名称中的虚线

    我一直在搜索互联网,试图找到一种方式来容纳我的表单元素的破折号到ASP.NET的控制器在MVC2,3或甚至4中的默认模型绑定行为.作为一名前端开发人员,我更喜欢在我的CSS中使用camelCase或下划线进行破折号.在我的标记中,我想要做的是这样的:在控制器中,我会传入一个C#对象,看起来像这样:有没有办法通过一些正则表达式或其他行为来扩展Controller类来适应这种情况?我讨厌这样的事实,我必须这样做:甚至这个:思考?

  10. c# – 用户界面设计工具

    我正在寻找一个用户界面设计工具来显示文档中可能的GUI.我不能生成代码.我知道MicrosoftVisio提供了一个功能.但有什么办法吗?您使用哪种软件可视化GUI?

返回
顶部