如何部署支持Silverlight的WCF服务?

发布于 2024-11-28 14:10:58 字数 585 浏览 0 评论 0原文

我正在编写我的第一个 Silverlight 应用程序,它使用支持 Silverlight 的 WCF 服务来检索数据并将数据发送到我的服务器。

我创建了一个 SL 应用程序 + ASP.NET MVC 网页来托管 SL 应用程序。

在 MVC 应用程序中,我创建 WCF 服务并在 SL 应用程序上使用它。到目前为止,一切都很好。

我使用 Web 部署来部署项目,它可以在我的远程主机上运行,​​但是使用 Fiddler,我意识到远程应用程序正在使用我在开发服务器上的 WCF 服务(又名 localhost:port)。

我在 VS 中更改了 WCF 服务,它现在指向远程主机,如果我部署该解决方案,到目前为止一切顺利。

但你知道,现在我的服务指向远程服务器并且不起作用,因为我必须创建用于跨域访问的 xml(fiddler 对我说,它正在查看domain.com/crossdomain.xml 而不是domain.com/虚拟目录/crossdomain.xml)。

所以我的问题是:我该如何处理这个问题?如果我的项目使用本地服务,而当我部署时,它使用远程服务,那就太好了。

我必须手动执行此操作还是有自动方法?

谢谢。

I'm programming my first Silverlight app and it uses a Silverlight-enabled WCF service to retrieve and send data to my server.

I created a SL application + ASP.NET MVC web page to host the SL app.

In the MVC app I create the WCF service and I consume it on the SL app. So far so good.

I deploy the project using the Web deploy and it works on my remote host but using Fiddler I realize that the remote app is using the WCF service I have on the development server (AKA localhost:port).

I changed the WCF service in VS and it now points to the remote host and if I deploy the solution, so far so good.

But you know, now my service points to a remote server and doesn't work because I have to create the xml for crossdomain access (and fiddler says to me that is looking on domain.com/crossdomain.xml instead of domain.com/virtualdirectory/crossdomain.xml).

So my question is: How I handle this? Would be good to have my project using the local service and when I deploy, it use the remote one.

Do I have to do this manually or there is an automatic way?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

美煞众生 2024-12-05 14:10:58

端点地址包含在 ServiceReferences.ClientConfig 文件中,该文件是嵌入到 XAP 包中的文件的一部分。当您部署到实时服务器时,您必须更新该文件。

解决方法是为客户端代理类构建一个工厂方法,该方法从 Silverlight 包的地址动态构建服务地址。 这里是一个指南,其中包含以下代码:

public class ServiceUtil {
    public static PeopleServiceClient GetPeopleServiceClient() {
        BasicHttpBinding binding = new BasicHttpBinding(
            Application.Current.Host.Source.Scheme.Equals("https", StringComparison.InvariantCultureIgnoreCase) 
            ? BasicHttpSecurityMode.Transport : BasicHttpSecurityMode.None);
        binding.MaxReceivedMessageSize = int.MaxValue;
        binding.MaxBufferSize = int.MaxValue;
        return new PeopleServiceClient(binding, new EndpointAddress(
            new Uri(Application.Current.Host.Source, "../PeopleService.svc")));
    }
}

使用这样的工厂,只要 silverlight XAP 文件和服务以相同的方式相对于 彼此。

The endpoint address is included in the ServiceReferences.ClientConfig file, which is then part of the files embedded in the XAP package. You have to update that file when you deploy to the live server.

A workaround is to build a factory method for the client proxy class, which builds the service address dynamically from the address of the Silverlight package. Here is a guide, which contains the following code:

public class ServiceUtil {
    public static PeopleServiceClient GetPeopleServiceClient() {
        BasicHttpBinding binding = new BasicHttpBinding(
            Application.Current.Host.Source.Scheme.Equals("https", StringComparison.InvariantCultureIgnoreCase) 
            ? BasicHttpSecurityMode.Transport : BasicHttpSecurityMode.None);
        binding.MaxReceivedMessageSize = int.MaxValue;
        binding.MaxBufferSize = int.MaxValue;
        return new PeopleServiceClient(binding, new EndpointAddress(
            new Uri(Application.Current.Host.Source, "../PeopleService.svc")));
    }
}

Using such a factory you will be able to deploy your app to any server without reconfiguration, as long as the silverlight XAP file and the service are located in the same way relative to eachother.

单挑你×的.吻 2024-12-05 14:10:58

您应该在服务器的根目录中添加一个 clientaccesspolicy.xml 文件。有关详细信息,请参阅此 MSDN 链接 。 crossdomain.xml 也可以使用,但微软把它放在那里是因为 Flash,clientaccesspolicy.xml 是首选,因为 Silverlight 仅支持 crossdomain.xml 的子集。

在部署之前最好使用 localhost 服务。部署时,您可以更改配置文件或编写代码来动态查找服务 URL。此示例假设该服务与 Silverlight XAP 位于相同的 url 中。

string serviceUrl = Application.Current.Host.Source.AbsoluteUri.Substring(0, Application.Current.Host.Source.AbsoluteUri.IndexOf("ClientBin/")) + "Services/DataService.svc"

You should add a clientaccesspolicy.xml file in the root of your server. See this MSDN link for more information. The crossdomain.xml can also be used, but Microsoft put it in there because of Flash, clientaccesspolicy.xml is preferred as Silverlight only supports a subset of crossdomain.xml.

It is good practice to use the localhost service until you deploy. When you deploy you can then change the config file or write code to find the service url dynamically. This example assumes that the service in the same url as the Silverlight XAP.

string serviceUrl = Application.Current.Host.Source.AbsoluteUri.Substring(0, Application.Current.Host.Source.AbsoluteUri.IndexOf("ClientBin/")) + "Services/DataService.svc"
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文