精华内容
下载资源
问答
  • 原文:WCF技术剖析之十:调用WCF服务的客户端应该如何进行异常处理在前面一片文章(服务代理不能得到及时关闭会有什么后果?)中,我们谈到及时关闭服务代理(Service Proxy)在一个高并发环境下的重要意义,并阐明...
    原文:WCF技术剖析之十:调用WCF服务的客户端应该如何进行异常处理

    在前面一片文章(服务代理不能得到及时关闭会有什么后果?)中,我们谈到及时关闭服务代理(Service Proxy)在一个高并发环境下的重要意义,并阐明了其根本原因。但是,是否直接调用ICommunicationObject的Close方法将服务代理关闭就万事大吉了呢?事情远不会这么简单,这其中还会涉及关于异常处理的一些操作,这就是本篇文章需要讨论的话题。

    一、异常的抛出与Close的失败

    一般情况下,当服务端抛出异常,客户客户端的服务代理不能直接关闭,WCF在执行Close方法的过程中会抛出异常。我们可以通过下面的例子来证实这一点。在这个例子中,我们依然沿用计算服务的例子,下面是服务契约和服务实现的定义:

       1: using System.ServiceModel;
       2: namespace Artech.ExceptionHandlingDemo.Contracts
       3: {
       4:     [ServiceContract(Namespace = "urn:artech.com")]
       5:     public interface ICalculator
       6:     {
       7:         [OperationContract]
       8:         int Divide(int x, int y);
       9:     }
      10: }

     

       1: using System;
       2: using System.ServiceModel;
       3: using Artech.ExceptionHandlingDemo.Contracts;
       4: namespace Artech.ExceptionHandlingDemo.Services
       5: {
       6:     class CalcualtorService : ICalculator { public int Divide(int x, int y) { return x / y; } }
       7: }

    为了确保服务代理的及时关闭,按照典型的编程方式,我们需要采用try/catch/finally的方式才操作服务代理对象,并把服务代理的关闭放在finally块中。WCF服务在客户端的调用程序如下所示:

       1: using System;
       2: using System.ServiceModel;
       3: using Artech.ExceptionHandlingDemo.Contracts;
       4: namespace Client
       5: {
       6:     class Program
       7:     {
       8:         static void Main(string[] args)
       9:         {
      10:             using (ChannelFactory<ICalculator> channelFatory = new ChannelFactory<ICalculator>(new WSHttpBinding(), "http://127.0.0.1:3721/calculatorservice"))
      11:             {
      12:                 ICalculator calcultor = channelFatory.CreateChannel(); try
      13:                 {
      14:                     calcultor.Divide(1, 0);
      15:                 }
      16:                 catch (Exception ex) { Console.WriteLine(ex.Message); }
      17:                 finally
      18:                 {
      19:                     (calcultor as ICommunicationObject).Close();
      20:                 }
      21:             }
      22:         }
      23:     }
      24: }

    由于传入的参数为1和0,在服务执行除法运算的时候,会抛出DividedByZero的异常。当服务端程序执行到finally块中对服务代理进行关闭的时候,会抛出如下一个CommunicationObjectFaultedException异常,提示SerivceChannel的状态为Faulted,不能用于后续Communication。

    image

    二、原理分析

    要解释具体的原因,还得从信道(Channel)的两种分类形式说起。在上面一篇文章中,我们就谈到过:WCF通过信道栈实现了消息的编码、传输及基于某些特殊功能对消息的特殊处理,而绑定对象是信道栈的缔造者,不同的绑定类型创建出来的信道栈具有不同的特性。就对会话的支持来讲,我们可以将信道分为以下两种:

    • 会话信道(Sessionful Channel):会话信道确保客户端和服务端之间传输的消息能够相互关联,但是信道的错误(Fault)会影响后续的消息交换;
    • 数据报信道(Datagram Channel):即使在同一个数据报信道中,每次消息的交换都是相互独立,信道的错误也不会影响后续的消息交换。

    由于上面的例子中,我们采用了WsHttpBinding,所以在默认条件下创建的信道(Channel)是会话信道(Sessionful Channel)。异常抛出后,当前信道的状态将变成Faulted,表示信道出现错误。错误的信道将不能继续用于后续的通信,即使是调用Close方法试图将其关闭也不行。

    也就是说异常导致信道错误(Faulted)的特性仅仅对于会话信道而言,而对于数据报信道,则没有这样的问题。对于WsHttpBinding在如下两种情况下下具有创建会话信道的能力:

    • 采用任何一种非None的SecurityMode
    • 采用ReliableSession

    再默认的情况下,WsHttpBinding采用的SecurityMode为Message,所以其创建的信道是会话信道。如果我们将其SecurityMode设为None,则在执行Close方法的时候则不会抛出任何异常(而实际上,服务代理的关闭与否对于数据报信道来讲,没有任何意义)。具体实现如下面的代码所示:

       1: using System;
       2: using System.ServiceModel;
       3: using Artech.ExceptionHandlingDemo.Contracts;
       4: namespace Client
       5: {
       6:     class Program
       7:     {
       8:         static void Main(string[] args)
       9:         {
      10:             using (ChannelFactory<ICalculator> channelFatory = new ChannelFactory<ICalculator>(new WSHttpBinding(SecurityMode.None), "http://127.0.0.1:3721/calculatorservice"))
      11:             {               //......
      12:             }
      13:         }
      14:     }
      15: }
      16:  

    三、Close() V.S. Abort()

    在这种情况下,一般会调用另一个方法:Abort,强行中断当前信道。一般情况下,对于客户端来说,信道在下面两种情况下状态会变成Faulted:

    • 调用超时,抛出TimeoutException
    • 调用失败,抛出CommunicationException

    所以正确的客户端进行服务调用的代码应该如下面的代码所示:通过try/catch控制服务调用,在try控制块中进行正常服务调用并正常关闭服务代理进程(调用Close方法);在catch控制块中,捕获CommunicationException和TimeoutException这两个异常,并将服务代理对象强行关闭(调用Abort方法)。下面的代码演示了基于ChannelFactory<T>创建服务代理的WCF客户端编程方式,对于直接通过强类型服务代理(继承ClientBase<T>的服务代理类型)进行服务调用具有相同的结构。

       1: using (ChannelFactory<ICalculator> channelFactory = new ChannelFactory<ICalculator>("calculateservice"))
       2: {
       3:     ICalculator calculator = channelFactory.CreateChannel();
       4:     try
       5:     {
       6:         int result = calculator.Divide(1, 0);
       7:         (calculator as ICommunicationObject).Close();
       8:     }
       9:     catch (CommunicationException ex)
      10:     {
      11:         //Exception Handling
      12:         (calculator as ICommunicationObject).Abort();
      13:     }
      14:     catch (TimeoutException ex)
      15:     {
      16:         //Exception Handling
      17:         (calculator as ICommunicationObject).Abort();
      18:     }
      19:     catch (Exception ex)
      20:     {
      21:         //Exception Handling
      22:     }
      23: }  

    四、通过一些编程技巧避免重复代码

    如果严格按中上面的编程方式对CommunicationException和TimeoutException进出捕获和处理,那么你的客户端代码就会到处充斥中相同的代码片断。我不知一次说过,如果你的代码中重复频率过高,或者编程人员广泛地采用Ctrl+C|Ctrl+V这样的编程方式,那么这就是你进行代码重构的信号。

    为此,我们可以通过对Delegate的利用来进行代码的分离(服务调用代码和异常处理代码)。比如,我写了下面两个Invoke方法:

       1: using System;
       2: using System.ServiceModel;
       3: using Artech.ExceptionHandlingDemo.Contracts;
       4: namespace Client
       5: {
       6:     class Program
       7:     {
       8:         static void Invoke<TContract>(TContract proxy, Action<TContract> action)
       9:         {
      10:             try
      11:             {
      12:                 action(proxy);
      13:                 (proxy as ICommunicationObject).Close();
      14:             }
      15:             catch (CommunicationException)
      16:             {
      17:                 (proxy as ICommunicationObject).Abort();
      18:                 //Handle Exception
      19:                 throw;
      20:             }
      21:             catch (TimeoutException )
      22:             {
      23:                 (proxy as ICommunicationObject).Abort();
      24:                 //Handle Exception
      25:                 throw;
      26:             }
      27:             catch (Exception)
      28:             {
      29:                 //Handle Exception
      30:                 (proxy as ICommunicationObject).Close();
      31:             }
      32:         }
      33:  
      34:         static TReturn Invoke<TContract, TReturn>(TContract proxy, Func<TContract, TReturn> func)
      35:         {
      36:             TReturn returnValue = default(TReturn);
      37:             try
      38:             {
      39:                returnValue =  func(proxy);
      40:             }
      41:             catch (CommunicationException)
      42:             {
      43:                 (proxy as ICommunicationObject).Abort();
      44:                 //Handle Exception
      45:                 throw;
      46:             }
      47:             catch (TimeoutException)
      48:             {
      49:                 (proxy as ICommunicationObject).Abort();
      50:                 //Handle Exception
      51:                 throw;
      52:             }
      53:             catch (Exception)
      54:             {
      55:                 //Handle Exception
      56:             }
      57:  
      58:             return returnValue;
      59:         }
      60:     }
      61: } 

    那么,对CalculatorService就可以简化成:

       1: using System;
       2: using System.ServiceModel;
       3: using Artech.ExceptionHandlingDemo.Contracts;
       4: namespace Client
       5: {
       6:     class Program
       7:     {
       8:         static void Main(string[] args)
       9:         {
      10:             using (ChannelFactory<ICalculator> channelFatory = new ChannelFactory<ICalculator>(new WSHttpBinding(), "http://127.0.0.1:3721/calculatorservice"))
      11:             {
      12:                 ICalculator calcultor = channelFatory.CreateChannel(); int result = Invoke<ICalculator, int>(calcultor, proxy => proxy.Divide(2, 1));                   //......               
      13:             }
      14:         }
      15:     }
      16: }

     


    作者:Artech
    出处:http://artech.cnblogs.com/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    posted on 2015-07-10 14:32 NET未来之路 阅读(...) 评论(...) 编辑 收藏

    转载于:https://www.cnblogs.com/lonelyxmas/p/4635651.html

    展开全文
  • 前景:使用阿里云人工智能(图片鉴黄识别)产品...2.本地实测阿里云SDK请求成功,无出现请求超时异常。 分析原因: 1.Linux服务器是内部搭建的服务器,无法连接外部网络,只能供内部局域网络使用 2.阿里云SDK请求...

    前景:使用阿里云人工智能(图片鉴黄识别)产品,检测某个站点的图片是否违规。整体功能和项目开发完成之后,部署到Linux服务器上运行。

    问题:

    1.使用了resin的WEB服务器进行运行项目,发现阿里云SDK请求超时。

    2.本地实测阿里云SDK请求成功,无出现请求超时异常。

    分析原因:

    1.Linux服务器是内部搭建的服务器,无法连接外部网络,只能供内部局域网络使用

    2.阿里云SDK请求时,会读取系统的“HTTP_PROXY、HTTPS_PROXY”的环境变量

    解决方案:

    1.内部网络配置特殊IP和端口可以连接外部网络

    2.Linux服务上的项目resin启动时,配置上特殊的IP和端口,那么阿里云SDK请求就可以成功了。

    实际操作例子如下:

      在resin启动文件中设置了HTTP_PROXY、HTTPS_PROXY的参数值,如果想看SDK请求时的HTTP_PROXY、HTTPS_PROXY的参数值,可以在SDK发起请求前打印下(例如:system.getEnv("HTTP_PROXY"))

    展开全文
  • 更多干货spring-boot系列一 之restfull api与多环境配置springboot系列二之 日志SpringBoot系列三之 MVC 模版引擎SpringBoot 2.0.0.M7 系列四 异常处理springboot 2.0.0.M7之 注解 与 配置springboot 2.0.0.M7 配置...

    更多干货


    调用REST服务

    • 调用REST服务
    • 使用代理调用rest服务

    添加依赖

    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
    </dependency>
    @Autowired
        private RestTemplateBuilder restTemplateBuilder;
    
        /**
         * get请求
         */
        @Test
        public void getForObject() {
    
            ViewerResult bean = restTemplateBuilder.build().getForObject("http://localhost:8081/api/blog/category/findAll", ViewerResult.class);
            System.out.println(bean);
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("id", 2);
            ViewerResult bean = restTemplateBuilder.build().postForObject("http://localhost:8081/api/blog/category/findAll", map, ViewerResult.class);
            System.out.println(bean);
    
            String result = restTemplateBuilder.additionalCustomizers(new ProxyCustomizer()).build().getForObject("http://111.231.142.109", String.class);
            System.out.println(result);
    
        }
    
        static class ProxyCustomizer implements RestTemplateCustomizer {
            @Override
            public void customize(RestTemplate restTemplate) {
                String proxyHost = "43.255.104.179";
                int proxyPort = 8080;
    
                HttpHost proxy = new HttpHost(proxyHost, proxyPort);
                HttpClient httpClient = HttpClientBuilder.create().setRoutePlanner(new DefaultProxyRoutePlanner(proxy) {
                    @Override
                    public HttpHost determineProxy(HttpHost target, HttpRequest request, HttpContext context)
                            throws HttpException {
                        System.out.println(target.getHostName());
                        return super.determineProxy(target, request, context);
                    }
                }).build();
                HttpComponentsClientHttpRequestFactory httpComponentsClientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(
                        httpClient);
                httpComponentsClientHttpRequestFactory.setConnectTimeout(10000);
                httpComponentsClientHttpRequestFactory.setReadTimeout(60000);
                restTemplate.setRequestFactory(httpComponentsClientHttpRequestFactory);
            }
        }

    在线代理:

    展开全文
  • 但是,是否直接调用ICommunicationObject的Close方法将服务代理关闭就万事大吉了呢?事情远不会这么简单,这其中还会涉及关于异常处理的一些操作,这就是本篇文章需要讨论的话题。 一、异常的抛出与Close的失败
    			

    在前面一片文章(服务代理不能得到及时关闭会有什么后果?)中,我们谈到及时关闭服务代理(Service Proxy)在一个高并发环境下的重要意义,并阐明了其根本原因。但是,是否直接调用ICommunicationObject的Close方法将服务代理关闭就万事大吉了呢?事情远不会这么简单,这其中还会涉及关于异常处理的一些操作,这就是本篇文章需要讨论的话题。

    一、异常的抛出与Close的失败

    一般情况下,当服务端抛出异常,客户客户端的服务代理不能直接关闭,WCF在执行Close方法的过程中会抛出异常。我们可以通过下面的例子来证实这一点。在这个例子中,我们依然沿用计算服务的例子,下面是服务契约和服务实现的定义:

       1: using System.ServiceModel;
       2: namespace Artech.ExceptionHandlingDemo.Contracts
       3: {
       4:     [ServiceContract(Namespace = "urn:artech.com")]
       5:     public interface ICalculator
       6:     {
       7:         [OperationContract]
       8:         int Divide(int x, int y);
       9:     }
      10: }

     

       1: using System;
       2: using System.ServiceModel;
       3: using Artech.ExceptionHandlingDemo.Contracts;
       4: namespace Artech.ExceptionHandlingDemo.Services
       5: {
       6:     class CalcualtorService : ICalculator { public int Divide(int x, int y) { return x / y; } }
       7: }

    为了确保服务代理的及时关闭,按照典型的编程方式,我们需要采用try/catch/finally的方式才操作服务代理对象,并把服务代理的关闭放在finally块中。WCF服务在客户端的调用程序如下所示:

       1: using System;
       2: using System.ServiceModel;
       3: using Artech.ExceptionHandlingDemo.Contracts;
       4: namespace Client
       5: {
       6:     class Program
       7:     {
       8:         static void Main(string[] args)
       9:         {
      10:             using (ChannelFactory<ICalculator> channelFatory = new ChannelFactory<ICalculator>(new WSHttpBinding(), "http://127.0.0.1:3721/calculatorservice"))
      11:             {
      12:                 ICalculator calcultor = channelFatory.CreateChannel(); try
      13:                 {
      14:                     calcultor.Divide(1, 0);
      15:                 }
      16:                 catch (Exception ex) { Console.WriteLine(ex.Message); }
      17:                 finally
      18:                 {
      19:                     (calcultor as ICommunicationObject).Close();
      20:                 }
      21:             }
      22:         }
      23:     }
      24: }

    由于传入的参数为1和0,在服务执行除法运算的时候,会抛出DividedByZero的异常。当服务端程序执行到finally块中对服务代理进行关闭的时候,会抛出如下一个CommunicationObjectFaultedException异常,提示SerivceChannel的状态为Faulted,不能用于后续Communication。

    image

    二、原理分析

    要解释具体的原因,还得从信道(Channel)的两种分类形式说起。在上面一篇文章中,我们就谈到过:WCF通过信道栈实现了消息的编码、传输及基于某些特殊功能对消息的特殊处理,而绑定对象是信道栈的缔造者,不同的绑定类型创建出来的信道栈具有不同的特性。就对会话的支持来讲,我们可以将信道分为以下两种:

    • 会话信道(Sessionful Channel):会话信道确保客户端和服务端之间传输的消息能够相互关联,但是信道的错误(Fault)会影响后续的消息交换;
    • 数据报信道(Datagram Channel):即使在同一个数据报信道中,每次消息的交换都是相互独立,信道的错误也不会影响后续的消息交换。

    由于上面的例子中,我们采用了WsHttpBinding,所以在默认条件下创建的信道(Channel)是会话信道(Sessionful Channel)。异常抛出后,当前信道的状态将变成Faulted,表示信道出现错误。错误的信道将不能继续用于后续的通信,即使是调用Close方法试图将其关闭也不行。

    也就是说异常导致信道错误(Faulted)的特性仅仅对于会话信道而言,而对于数据报信道,则没有这样的问题。对于WsHttpBinding在如下两种情况下下具有创建会话信道的能力:

    • 采用任何一种非None的SecurityMode
    • 采用ReliableSession

    再默认的情况下,WsHttpBinding采用的SecurityMode为Message,所以其创建的信道是会话信道。如果我们将其SecurityMode设为None,则在执行Close方法的时候则不会抛出任何异常(而实际上,服务代理的关闭与否对于数据报信道来讲,没有任何意义)。具体实现如下面的代码所示:

       1: using System;
       2: using System.ServiceModel;
       3: using Artech.ExceptionHandlingDemo.Contracts;
       4: namespace Client
       5: {
       6:     class Program
       7:     {
       8:         static void Main(string[] args)
       9:         {
      10:             using (ChannelFactory<ICalculator> channelFatory = new ChannelFactory<ICalculator>(new WSHttpBinding(SecurityMode.None), "http://127.0.0.1:3721/calculatorservice"))
      11:             {               //......
      12:             }
      13:         }
      14:     }
      15: }
      16:  

    三、Close() V.S. Abort()

    在这种情况下,一般会调用另一个方法:Abort,强行中断当前信道。一般情况下,对于客户端来说,信道在下面两种情况下状态会变成Faulted:

    • 调用超时,抛出TimeoutException
    • 调用失败,抛出CommunicationException

    所以正确的客户端进行服务调用的代码应该如下面的代码所示:通过try/catch控制服务调用,在try控制块中进行正常服务调用并正常关闭服务代理进程(调用Close方法);在catch控制块中,捕获CommunicationException和TimeoutException这两个异常,并将服务代理对象强行关闭(调用Abort方法)。下面的代码演示了基于ChannelFactory<T>创建服务代理的WCF客户端编程方式,对于直接通过强类型服务代理(继承ClientBase<T>的服务代理类型)进行服务调用具有相同的结构。

       1: using (ChannelFactory<ICalculator> channelFactory = new ChannelFactory<ICalculator>("calculateservice"))
       2: {
       3:     ICalculator calculator = channelFactory.CreateChannel();
       4:     try
       5:     {
       6:         int result = calculator.Divide(1, 0);
       7:         (calculator as ICommunicationObject).Close();
       8:     }
       9:     catch (CommunicationException ex)
      10:     {
      11:         //Exception Handling
      12:         (calculator as ICommunicationObject).Abort();
      13:     }
      14:     catch (TimeoutException ex)
      15:     {
      16:         //Exception Handling
      17:         (calculator as ICommunicationObject).Abort();
      18:     }
      19:     catch (Exception ex)
      20:     {
      21:         //Exception Handling
      22:     }
      23: }  

    四、通过一些编程技巧避免重复代码

    如果严格按中上面的编程方式对CommunicationException和TimeoutException进出捕获和处理,那么你的客户端代码就会到处充斥中相同的代码片断。我不知一次说过,如果你的代码中重复频率过高,或者编程人员广泛地采用Ctrl+C|Ctrl+V这样的编程方式,那么这就是你进行代码重构的信号。

    为此,我们可以通过对Delegate的利用来进行代码的分离(服务调用代码和异常处理代码)。比如,我写了下面两个Invoke方法:

       1: using System;
       2: using System.ServiceModel;
       3: using Artech.ExceptionHandlingDemo.Contracts;
       4: namespace Client
       5: {
       6:     class Program
       7:     {
       8:         static void Invoke<TContract>(TContract proxy, Action<TContract> action)
       9:         {
      10:             try
      11:             {
      12:                 action(proxy);
      13:                 (proxy as ICommunicationObject).Close();
      14:             }
      15:             catch (CommunicationException)
      16:             {
      17:                 (proxy as ICommunicationObject).Abort();
      18:                 //Handle Exception
      19:                 throw;
      20:             }
      21:             catch (TimeoutException )
      22:             {
      23:                 (proxy as ICommunicationObject).Abort();
      24:                 //Handle Exception
      25:                 throw;
      26:             }
      27:             catch (Exception)
      28:             {
      29:                 //Handle Exception
      30:                 (proxy as ICommunicationObject).Close();
      31:             }
      32:         }
      33:  
      34:         static TReturn Invoke<TContract, TReturn>(TContract proxy, Func<TContract, TReturn> func)
      35:         {
      36:             TReturn returnValue = default(TReturn);
      37:             try
      38:             {
      39:                returnValue =  func(proxy);
      40:             }
      41:             catch (CommunicationException)
      42:             {
      43:                 (proxy as ICommunicationObject).Abort();
      44:                 //Handle Exception
      45:                 throw;
      46:             }
      47:             catch (TimeoutException)
      48:             {
      49:                 (proxy as ICommunicationObject).Abort();
      50:                 //Handle Exception
      51:                 throw;
      52:             }
      53:             catch (Exception)
      54:             {
      55:                 //Handle Exception
      56:             }
      57:  
      58:             return returnValue;
      59:         }
      60:     }
      61: } 

    那么,对CalculatorService就可以简化成:

       1: using System;
       2: using System.ServiceModel;
       3: using Artech.ExceptionHandlingDemo.Contracts;
       4: namespace Client
       5: {
       6:     class Program
       7:     {
       8:         static void Main(string[] args)
       9:         {
      10:             using (ChannelFactory<ICalculator> channelFatory = new ChannelFactory<ICalculator>(new WSHttpBinding(), "http://127.0.0.1:3721/calculatorservice"))
      11:             {
      12:                 ICalculator calcultor = channelFatory.CreateChannel(); int result = Invoke<ICalculator, int>(calcultor, proxy => proxy.Divide(2, 1));                   //......               
      13:             }
      14:         }
      15:     }
      16: }

     


    注:部分内容节选自《WCF技术剖析(卷1)》第八章:客户端(Clients)

    WCF技术剖析系列:

    WCF技术剖析之一:通过一个ASP.NET程序模拟WCF基础架构
    WCF技术剖析之二:再谈IIS与ASP.NET管道
    WCF技术剖析之三:如何进行基于非HTTP的IIS服务寄宿
    WCF技术剖析之四:基于IIS的WCF服务寄宿(Hosting)实现揭秘
    WCF技术剖析之五:利用ASP.NET兼容模式创建支持会话(Session)的WCF服务
    WCF技术剖析之六:为什么在基于ASP.NET应用寄宿(Hosting)下配置的BaseAddress无效
    WCF技术剖析之七:如何实现WCF与EnterLib PIAB、Unity之间的集成
    WCF技术剖析之八:ClientBase<T>中对ChannelFactory<T>的缓存机制
    WCF技术剖析之九:服务代理不能得到及时关闭会有什么后果?
    WCF技术剖析之十:调用WCF服务的客户端应该如何进行异常处理

    WCF技术剖析之十一:异步操作在WCF中的应用(上篇)
    WCF技术剖析之十一:异步操作在WCF中的应用(下篇)
    WCF技术剖析之十二:数据契约(Data Contract)和数据契约序列化器(DataContractSerializer)
    WCF技术剖析之十三:序列化过程中的已知类型(Known Type)
    WCF技术剖析之十四:泛型数据契约和集合数据契约(上篇)
    WCF技术剖析之十四:泛型数据契约和集合数据契约(下篇)
    WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用
    WCF技术剖析之十六:数据契约的等效性和版本控制


    展开全文
  • 可以直接正常访问微服务,但是通过Ribbon或者Feign调用...通过Ribbon调用服务异常如下: 通过Feign调用服务异常如下: 可能是打开了idea中HTTP代理造成的,只需要关闭HTTP代理即可正常访问,如下图: ...
  • http://www.cnblogs.com/artech/archive/2009/07/05/1517257.html在(服务代理不能得到及时关闭会有什么后果?...但是,是否直接调用ICommunicationObject的Close方法将服务代 理关闭就万事大吉了呢?事情远...
  • 在这种情况,请求的调用链,我们可以通过函数之间的调用,打日志,系统如果出现异常,可以通过分析日志去找bug;如果系统遇到性能瓶颈,想知道从请求进来到返回,是业务哪一步出了问题,可以通过调用链路间请求时长...
  • 异步服务调用的工作原理

    千次阅读 2018-02-08 12:15:23
    1、消费者调用服务端发布的接口,接口调用由分布式服务框架包装成动态代理,发起远程服务调用; 2、通信框架异步发送请求消息,如果没有发生I/O异常,返回; 3、请求消息发送成功后,I/O线程构造Future对象,设置...
  • wsdl 已经把webservice放到了外网上的服务器了。...然后我根据这个url生成了客户端类,用来调用webservice的。如下: D:\generateAxisClient>Java -Djava.ext.dirs=lib org.apache.axis.wsdl.WSDL2Java ...
  • 爬取内容:排行榜名称 爬取目标:存储到本地文件中 ...涉及,浏览器伪装,代理服务器,异常处理 代码如下: from bs4 import BeautifulSoup #调用库 from urllib import request,error try: url = 'htt...
  • 大家都很熟悉结构化的异常处理方式。最近遇到一个问题,我在练习Remtoting,...问题来了,客户端在通关服务类的代理对象调用时,在服务端抛出了异常。奇怪的是,异常居然不能在客户端捕获。怎么可能? 这不就颠覆了...
  • 经测试,直接访问ajax调用的地址可以正常访问,在其他服务器上调用也正常可以调用,就是在本机上用代理不可以访问,用netstat -nat 发现既然有好多更换之前的老ip地址的80端口访问现在的80端口,其状态都是 syn_sent...
  • <div><p>场景: 我的a服务要去调用b服务,所以a的接口引用了b的接口。 在a调用b的时候 会引发:一次成功,一次这个异常。 di'yi'ci第一次,成功, 第二次,失败࿰...
  • 数据库异常

    2018-12-29 16:19:06
    异常描述: web端用户在创建群组时,没有反应。创建群组的接口是调用底层消息中间件(即时通信)所提供的。 原因分析: 通过查看日志发现,http消息服务在访问数据库服务代理时,请求超时。进一步跟进查看数据库...
  • 在微服务架构中,业务的调用链非常复杂,一个来自用户的请求可能涉及到几十个服务的协同处理。因此需要一个跟踪系统来记录和分析同一次请求在整个调用链上的相关事件,从而帮助研发和运维人员分析系统瓶颈,快速定位...
  • WCF 异常与处理

    2008-12-02 20:06:00
    WCF异常与实例管理 当服务实例出现异常时,WCF并不会关闭...如果调用引发异常,那么紧跟在异常之后,服务实例会被释放,代理将在客户端抛出FaultException异常。在默认的情况下,所有服务抛出的异常(包括FaultE...
  • 以上两种情况均需要手动维护微服务的应用地址和端口,不易于微服务集群维护,当微服务出错或者关闭时,可能引起服务异常。 因此,若可以让微服务在启动后自行在一个地方注册,并统一管理微服务地址则省去了手
  • 时而客户端得到异常:请求通道在等待 00:00:59.9840000以后答复超时。增加传递给请求调用的超时值,或者增加绑定上的 SendTimeout 值。分配给此操作的时间可能是更长超时的一部分。服务重启之后恢复正常。 在Artech...
  • 错误与异常

    2008-10-09 09:19:00
    如果代表某个客户端的服务调用导致异常,并不会结束宿主进程,其他客户端仍然可以访问该服务,托管在相同进程中的其他服务也不会受到影响。因此,当一个未经处理的异常离开服务的范围时,分发器会捕获它,并将它序列...
  • 在 WCF 中,客户端调用服务时,可能抛出的异常有以下三种类型。1. 通讯异常。诸如网络错误,地址错误,服务器没有启动等等。这类异常多是 CommunicationException (或其具体继承类型)。2. 状态异常。比如访问了已经...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 248
精华内容 99
关键字:

代理调用服务异常