Silverlight动态设置WCF服务Endpoint

2013-02-02 05:57 by jv9, 1763 阅读, 3 评论, 收藏编辑

去年12月收到一位朋友的邮件,咨询Silverlight使用WCF服务,应用部署后一直无法访问的问题,通过几次交流,才发现在他的项目中,全部使用静态URL作为WCF服务的Endpoint地址,后来修改为动态地址后,问题解决。本篇简单介绍如何创建动态WCF Endpoint。

Silverlight项目中通过WCF服务进行客户端与服务器端数据交互,其方法是在Silverlight客户端添加服务引用(Service Reference),Silverlight会在客户端项目中生成一个名为ServiceReference.ClientConfig的配置文件。该配置文件中包含有WCF服务的Endpoint URL地址,而该地址将指引Silverlight客户端服务请求到对应服务器端服务接口。默认情况下,客户端生成的Endpoint地址为localhost,当应用发布时,该地址将随着Web服务器的配置不同而改变。

作为默认设置,每次Web服务器配置切换,开发人员不得不手动修改WCF服务配置,Silverlight应用无法完全依赖于ServiceReference.ClientConfig配置。这样不仅增加了维护成本,而且为代码维护添加难度。

首先在项目中添加WCF服务,Silverlight 默认生成ServiceReference.ClientConfig文件,从配置文件中可以看出,Endpoint都是指向本地。

<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_ProxyService" maxBufferSize="2147483647"
                    maxReceivedMessageSize="2147483647">
                    <security mode="None" />
                </binding>
                <binding name="BasicHttpBinding_WidgetService" maxBufferSize="2147483647"
                    maxReceivedMessageSize="2147483647">
                    <security mode="None" />
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost/WCFTest/Proxy.svc"
                binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ProxyService"
                contract="WCFTestProxy.ProxyService" name="BasicHttpBinding_ProxyService" />
            <endpoint address="http://localhost/WCFTest/Widget.svc"
                binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_WidgetService"
                contract="WCFTestWidgetService.WidgetService" name="BasicHttpBinding_WidgetService" />
        </client>
    </system.serviceModel>
</configuration>

为了实现动态设置Endpoint,下面将创建一个辅助类DynamicEndpointHelper,

public class DynamicEndpointHelper
{
    // BaseUrl是部署服务的Web服务器地址
    private const string BaseUrl = "http://localhost/WCFTest/";

    public static string ResolveEndpointUrl(string endpointUrl, string xapPath)
    {
        string baseUrl = xapPath.Substring(0, xapPath.IndexOf("ClientBin"));
        string relativeEndpointUrl = endpointUrl.Substring(BaseUrl.Length);
        string dynamicEndpointUrl = baseUrl + relativeEndpointUrl;
        return dynamicEndpointUrl;
    }
}

而在Silverlight客户端,可以通过后台代码实现动态设置Endpoint,

private WCFTestProxy.ProxyServiceClient GetProxyService()
{
    WCFTestProxy.ProxyServiceClient service = new WCFTestProxy.ProxyServiceClient();
    service.Endpoint.Address = new EndpointAddress(
        DynamicEndpointHelper.ResolveEndpointUrl(service.Endpoint.Address.Uri.ToString(),
        App.Current.Host.Source.ToString()));
    return service;
}

在创建完成代理客户端服务后,Endpoint地址将指向当前运行的Web地址。值得注意的是,该方法仅能支持应用与服务在相同域中,如果服务在不同的域中,必须进行跨域设置才能完成动态设置。

转自:http://www.cnblogs.com/jv9/archive/2013/02/02/2889738.html

时间: 2024-10-11 04:10:28

Silverlight动态设置WCF服务Endpoint的相关文章

Silverlight客户端调用WCF服务难题解疑

Silverlight客户端调用WCF服务在实际使用中经常会出现的问题就是无法直接应用类文件和配置文件.微软针对这一情况已经给出了解决办法.WCF开发框架可以帮助我们实现可靠性较高的跨平台解决方案.对于这样一款功能性较强的工具,我们在实际使用中通常也会遇到一些问题.在这里就来了解一下其中Silverlight客户端调用WCF服务的一些难题解疑. WCF服务端做好后,可以通过SVCUTIL.exe工具生成客户端代码和配置文件,这些内容比较简单,在这里就不做详细介绍. 但是,如果使用Silverli

记录:Web无引用无配置方式动态调用WCF服务

这几年一直用WebApi较多,最近项目中有个需求比较适合使用WCF,以前也用过JQuery直接调用Wcf的,但是说实话真的忘了… 所以这次解决完还是花几分钟记录一下 WCF服务端:宿主在现有Win服务中,在服务启动时添加代码 ,服务代码就不用写了,接口和实现按照契约实现即可 private ServiceHost serviceHost = null; //服务宿主 //启动WCF服务 if (serviceHost != null) { serviceHost.Close(); } servi

动态调用WCF服务

本文转载:http://www.cnblogs.com/wiseant/archive/2010/07/29/1787599.html 原文地址:http://blog.csdn.net/castlooo/archive/2010/05/06/5562619.aspx 客户端调用wcf ,有时需要动态的调用服务端的WCF中的方法,本方法,反射wcf 的接口,动态调用接口中的方法. 主要为,动态绑定,反射动态调用. 1 Code highlighting produced by Actipro C

托管 WCF 服务

WCF 中,最让我感到兴奋的方面是它可以把服务托管在任意程序中,而不一定是网站服务器.这开启了一种可能性,即创建的服务,其实现可以动态改变的能力,因为它们能够托管在 fsi.exe.为了使前面的示例能够运行在 fsi.exe,还需要对它做一些修改,但修改相当简单. 清单 11-13 展示了清单 11-9修改后的版本,它能够运行在 fsi.exe. 清单 11-13 托管在 F#交互中的服务 #I @"C:\Program Files\Reference Assemblies\Microsoft\

IIS10 设置支持wcf服务(.svc)

感谢: http://www.cnblogs.com/dudu/p/3328066.html 如果提示web.config配置重复的话,很有可能是.net framework版本的问题,把IIS中的版本设置为2.0就可以了. 如何让IIS10支持WCF服务呢? 1. 首先添加MIME类型:扩展名“.svc”,MIME类型 “application/octet-stream”: 2. 然后在“Handler Mappings(处理程序映射)”中添加Managed Handler(添加托管处理程序)

Silverlight中异步调用WCF服务,传入回调函数

以前学的ASP.NET,调用的都是同步方法,同步方法的好处就是,一步一步走,完成这步才会走下一步.然而,WCF使用的都是异步方法,调用之后不管有没有获得结果就直接往下走,最可恶的是异步函数都是Void类型,得不到返回结果,虽然有Completed的事件处理,但是还是感觉比较束缚,无法与前端交互. 这里就跟大家分享一种传入回调函数的方法,把前台的方法写好,传到后台,让异步方法调用完成时执行.废话不多说了,开始写代码: 首先,要先建一个带网站的sliverlight项目,这里就不细说了,在网站中添加

Silverlight应用程序引用WCF服务时报错:无法激活服务,因为它不支持 ASP.NET 兼容性

wcf错误: 无法激活服务,因为它不支持 ASP.NET 兼容性.已为此应用程序启用了 ASP.NET 兼容性.请在 web.config 中关闭 ASP.NET 兼容性模式,或将 AspNetCompatibilityRequirements 特性添加到服务类型且同时将 RequirementsMode 设置为“Allowed”或“Required”. 错误(表象)原因: 一般是因为程序添加了启用了AJAX的WCF服务,在添加WCF服务,浏览WCF服务时出现以上错误,而浏览AJAX的WCF服务

Silverlight C#动态设置样式

1.从页面资源中获取样式并应用 btnTest.Style = (Style)this.Resources["BigButtonStyle"] 2.从项目中单独分开的资源字典文件(或一个引用的程序集中)中获取样式. 首先,需要创建一个ResourceDictionary对象并提供正确的URI: ResourceDictionary dictionary = new ResourceDictionary(); dictionary.Source = new Uri("/Test

用WCF服务来动态的获取本地XML省市区文档

建立一个WCF服务. 1 using ClassLibrary; 2 using System; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Runtime.Serialization; 6 using System.ServiceModel; 7 using System.ServiceModel.Web; 8 using System.Text; 9 using System.Xml; 10