解析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日

相关文章

  • .Net Core 2.2升级3.1的避坑指南(小结)

    .NET Core 2.2升级3.1的避坑指南(小结) 在将.NET Core 2.2升级到3.1时,可能会遇到一些问题。本攻略将提供一些避坑指南,以帮助您顺利完成升级。 1. 更新NuGet包 在将.NET Core 2.2升级到3.1时,需要更新NuGet包。可以按照以下步骤操作: 打开Visual Studio。 在“解决方案资源管理器”中,右键单击项…

    C# 2023年5月16日
    00
  • c# 颜色选择控件的实现代码

    下面我将为你详细讲解如何实现一个C#颜色选择控件的代码,包括其实现思路和示例说明。 实现思路 要实现一个C#颜色选择控件,可以通过使用ColorDialog控件和Button控件的组合来实现。 ColorDialog控件是C#中用于显示颜色选择对话框的控件,它允许用户从一组预定义颜色中进行选择或使用自定义颜色来指定颜色。Button控件可以用来触发颜色选择对…

    C# 2023年6月7日
    00
  • ADO.NET实用技巧两则

    下面是“ADO.NET实用技巧两则”的完整攻略: ADO.NET实用技巧一:使用DataReader处理大批量数据 在处理大量数据时,使用DataReader可以有效地减少内存占用。 实现方法 使用SqlCommand查询数据 “`csharp string connectionString = “YourConnectionString”; SqlCon…

    C# 2023年6月3日
    00
  • C# 基于NAudio实现对Wav音频文件剪切(限PCM格式)

    下面是详细讲解如何使用C#和NAudio库来实现对Wav音频文件的剪切操作。 1. 准备工作 在开始之前,需要先准备好以下工作: 安装.NET开发环境(建议使用Visual Studio,下载地址:https://visualstudio.microsoft.com/zh-hans/downloads/); 安装NAudio库(可以使用NuGet进行安装,或…

    C# 2023年6月1日
    00
  • C#实现日期时间的格式化输出的示例详解

    C#实现日期时间的格式化输出的示例详解 在C#中,我们经常需要使用日期时间类型进行操作,而日期时间的输出格式化是常见的需求之一。本文将详细讲解如何使用C#实现日期时间的格式化输出。 日期时间输出格式化方法 在C#中,我们可以使用ToString()函数将日期时间格式化为指定的字符串。ToString()函数有多个重载形式,其中最常用的是将格式字符串作为参数的…

    C# 2023年6月1日
    00
  • 详解C++中string的用法和例子

    详解C++中string的用法和例子 string简介 在C++中,string是一个非常实用的类,用于处理文本字符串。它的功能比C语言中的char数组更强大、更简单,也更安全。 头文件引入 使用string需要引入以下头文件: #include <string> 命名空间 想要使用string类,需要用到std命名空间。可以使用如下的名称空间声…

    C# 2023年6月8日
    00
  • .NET 中的装箱与拆箱实现过程

    .NET 中的装箱与拆箱实现过程 什么是装箱和拆箱? 在 .NET 中,将值类型变量转换为引用类型变量的过程就称为 装箱(boxing),而将引用类型变量转换为值类型变量的过程则称为 拆箱(unboxing)。 装箱和拆箱在 .NET 中非常常见,比如我们经常使用 List<T>、Dictionary<TKey, TValue> 等集…

    C# 2023年6月3日
    00
  • C#在Unity游戏开发中进行多线程编程的方法

    C#在Unity游戏开发中进行多线程编程的方法 在Unity游戏开发中,多线程编程可以提高游戏性能和可玩性,让游戏更加流畅。而在C#中,我们可以使用Thread类来进行多线程编程。 使用Thread类进行多线程编程 Thread类是.NET中用于创建和管理线程的类。在Unity游戏开发中,我们可以使用它来创建和管理多线程。 创建线程 创建线程有两种方式,一种…

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