解析Silverlight调用WCF/Rest异常的解决方法

解析Silverlight调用WCF/Rest异常的解决方法。下面我们来一步步讲解。

问题描述

在使用Silverlight调用WCF/Rest服务时,可能会遇到各种异常错误,比如:

  • System.ServiceModel.CommunicationException
  • System.ServiceModel.FaultException
  • System.Net.WebException等等。

那么,如何解决这些异常呢?接下来,将详细讲解这个问题。

解决方法

针对这个问题,我们可以有以下方式解决:

1. 在服务端增加配置

在服务端的web.config中添加以下配置:

<system.serviceModel>
  <services>
    <service name="MyService">
      <endpoint binding="customBinding" bindingConfiguration="crossDomain" contract="IMyService" />
      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      <host>
        <baseAddresses>
          <add baseAddress="http://localhost:8000/MyService/" />
        </baseAddresses>
      </host>
    </service>
  </services>
  <bindings>
    <customBinding>
      <binding name="crossDomain">
        <textMessageEncoding messageVersion="Soap11" />
        <httpTransport allowCookies="false" authenticationScheme="Anonymous" bypassProxyOnLocal="true" hostNameComparisonMode="WeakWildcard" maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" useDefaultWebProxy="true"/>
      </binding>
    </customBinding>
  </bindings>
  <behaviors>
    <serviceBehaviors>
      <behavior>
        <serviceMetadata httpGetEnabled="false" />
        <serviceDebug includeExceptionDetailInFaults="true" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>

2. 在客户端增加配置

在客户端的App.config中添加以下配置:

<system.serviceModel>
  <bindings>
    <customBinding>
      <binding name="CustomBinding_IMyService">
        <textMessageEncoding messageVersion="Soap11" />
        <httpTransport maxReceivedMessageSize="2147483647" allowCookies="true" authenticationScheme="Anonymous" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" proxyAuthenticationScheme="Anonymous" realm="" useDefaultWebProxy="false" />
      </binding>
    </customBinding>
  </bindings>
  <client>
    <endpoint address="http://localhost:8000/MyService/" binding="customBinding" bindingConfiguration="CustomBinding_IMyService" contract="IMyService" name="CustomBinding_IMyService" />
  </client>
</system.serviceModel>

示例一:使用Rest服务获取数据

在服务端,我们可以创建TestService.svc文件,内容如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;

namespace TestService
{
    [ServiceContract]
    public interface ITestService
    {
        [OperationContract]
        [WebGet(UriTemplate = "/GetData/{value}", ResponseFormat = WebMessageFormat.Json)]
        string GetData(string value);
    }

    public class TestService : ITestService
    {
        public string GetData(string value)
        {
            return "You entered: " + value;
        }
    }
}

在客户端,我们可以使用以下代码调用服务:

private void CallRestService()
{
    WebClient client = new WebClient();
    client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(OnDownloadStringCompleted);
    client.DownloadStringAsync(new Uri("http://localhost:8000/TestService/GetData/123"));
}

private void OnDownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
    if (e.Error == null)
    {
        MessageBox.Show(e.Result);
    }
    else
    {
        MessageBox.Show(e.Error.Message);
    }
}

示例二:使用WCF服务获取数据

在服务端,我们可以创建TestService.svc文件,内容如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;

namespace TestService
{
    [ServiceContract]
    public interface ITestService
    {
        [OperationContract]
        string GetData(string value);
    }

    public class TestService : ITestService
    {
        public string GetData(string value)
        {
            return "You entered: " + value;
        }
    }
}

在客户端,我们可以使用以下代码调用服务:

private void CallWcfService()
{
    TestServiceClient client = new TestServiceClient();
    client.GetDataCompleted += new EventHandler<GetDataCompletedEventArgs>(OnGetDataCompleted);
    client.GetDataAsync("123");
}

private void OnGetDataCompleted(object sender, GetDataCompletedEventArgs e)
{
    if (e.Error == null)
    {
        MessageBox.Show(e.Result);
    }
    else
    {
        MessageBox.Show(e.Error.Message);
    }
}

通过以上方式,我们就可以解决Silverlight调用WCF/Rest异常的问题了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:解析Silverlight调用WCF/Rest异常的解决方法 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • C#导出Excel的示例详解

    C#导出Excel的示例详解 介绍 在实际的项目中,我们经常需要将数据导出到Excel表格中,以方便查阅和管理。C#作为一门强大的编程语言,在导出Excel方面也有非常不错的表现。本篇文章将详细讲解如何使用C#导出Excel表格。 准备工作 我们需要使用C#自带的OpenXML库来实现Excel的导出。在使用前,需要进行一些准备工作: 引入DocumentF…

    C# 2023年6月7日
    00
  • Parallel.For循环与普通for循环的性能比较

    针对“Parallel.For循环与普通for循环的性能比较”的话题,我将给出一份详细的攻略,包含以下几个部分: 什么是Parallel.For循环? Parallel.For的性能优势是什么? 如何使用Parallel.For循环? Parallel.For循环的示例说明 普通for循环与Parallel.For循环的性能比较 下面就一步一步进行介绍。 1…

    C# 2023年6月7日
    00
  • .Net Core使用Logger实现log写入本地文件系统

    下面是详细讲解”.Net Core使用Logger实现log写入本地文件系统”的完整攻略。 一、前言 在开发过程中,记录系统运行状态和错误信息是非常重要的一件事情,这时候就需要使用log来记录。在.Net Core中,可以通过Logger实现log写入本地文件系统。 二、Logger介绍 Logger是.NET Core框架中的一个基本组件,它允许您轻松地记…

    C# 2023年6月3日
    00
  • Unity色子的投掷和点数的获得详析

    Unity色子的投掷和点数的获得详析 简介 Unity中自带的Dice Roller模块提供了非常便利的骰子投掷功能,本文将详细讲解如何使用该模块进行色子投掷以及如何获取色子的点数。 前置知识 在使用Dice Roller模块之前,需要先了解Unity的游戏对象和脚本的基本使用方法。 基本用法 投掷一个骰子 要使用Dice Roller模块投掷一个骰子,可以…

    C# 2023年6月3日
    00
  • c# 实现IComparable、IComparer接口、Comparer类的详解

    C#实现IComparable、IComparer接口、Comparer类的详解 IComparable 接口 System.IComparable 接口定义了比较对象的方法,该方法将对象与相同类的另一个对象进行比较。如果对象 ‘A’ 应该排在对象 ‘B’ 之前,则该方法返回负数值;如果对象 ‘A’ 应该排在对象 ‘B’ 之后,则返回正数值;如果对象 ‘A’…

    C# 2023年5月15日
    00
  • 在ASP.NET 2.0中操作数据之二:创建一个业务逻辑层

    创建一个业务逻辑层(Business Logic Layer, BLL)是在ASP.NET 2.0中操作数据的一个重要方面,这个层次实现了在数据层之上的逻辑层次。 以下是在ASP.NET 2.0中创建业务逻辑层的完整攻略: 1. 在项目中加入一个业务逻辑层 创建一个新Web应用程序,并选择ASP.NET空白网站模板。选择一个好的名称和位置,然后创建并打开解决…

    C# 2023年5月31日
    00
  • Asp.net core 使用SignalR推送消息过程详解

    Asp.net core 使用SignalR推送消息过程详解 SignalR是一个基于ASP.NET Core的实时通讯框架,允许服务器端代码通过WebSockets、Server-Sent Events (SSE)、Long Polling或Forever Frame等协议向客户端推送消息,同时也支持客户端向服务器端发送消息。 SignalR的核心组件是H…

    C# 2023年6月3日
    00
  • C#中事件的动态调用实现方法

    下面就为大家详细讲解C#中事件的动态调用实现方法的完整攻略。 简介 在C#中,事件是非常常用的机制。有时我们需要在运行时动态地添加和移除事件的监听器,这时候动态调用事件就显得非常重要了。本文将详细介绍C#中动态调用事件的实现方法。 使用委托实现动态调用事件 C#中事件使用委托实现,在C#中委托是一种特殊的类型,它被用来封装具有相同参数和返回类型的方法。事件本…

    C# 2023年6月6日
    00
合作推广
合作推广
分享本页
返回顶部