0

这可能很简单,但请耐心等待。

当我将带有 WCF 的 Silverlight 5 应用程序部署到 IIS 时,使用简单的复制和粘贴技术,我可以完美地浏览网站,但是当我尝试通过像 192.168.1.3:8099 这样的 ipaddress 访问它时,每个服务调用都会返回错误,例如作为这个:

An exception occurred during the operation, making the result invalid.  Check InnerException for exception details.
  at .....
  at <MyNamespace>.OnGetSomethingFromDataBaseCompleted(Object state)

我可以成功地定位来自其他机器的 WCF 服务(192.168.1.3:8099/SomeService.svc)。我编写了测试控制台应用程序来调用(并关闭)该服务,它正确地从远程 DBServer 获取了一些数据。然而在浏览器中什么都没有。

当导航到 192.168.1.3:8099 时,A 应该从浏览器添加回 Fiddler 不会注册此调用,但它会从 localhost:8099 注册。

你能帮我吗?

我认为对于比我更有部署经验的人来说,这是一个简单的问题,但如果您认为应该这样做,请继续阅读。


所以你正在阅读=>(棱镜)。

我有一个 Silverlight 应用程序,它连接到调用 WCF 服务的数据库(添加为 Silverlight WCF 服务 - VSTemplate)。

在这个应用程序中,我像Jeremy Likness在他的博客上建议的那样介绍 Prism

我还使用 Web 代理从 ViewModel 访问 WCF 服务。

我的项目结构:

  • 网络项目
  • SilverlightAppWithShell
  • 模块A
  • 模块B
  • 共同项目

部署目录结构:

C:\inetpub\wwwroot\MyAppFolder(IIS 用户可以访问它)

  • .\bin\AllDlls
  • .\ClientBin\AllXapFiles(来自上述所有项目的 XAP 文件)
  • .\Services\All *.cs 定义服务操作合同的文件
  • .\Web.config
  • .\TestPage.html
  • .\TestPage.aspx
  • .\Silverlight.js
  • .\AllServices *.scv 文件

最后但并非最不重要

  • .\clientaccesspolicy.xml

里面有这段代码:

<?xml version="1.0" encoding="utf-8"?>
<access-policy>
  <cross-domain-access>
    <policy>
      <allow-from http-request-headers="*">
        <domain uri="*"/>"
      </allow-from>
      <grant-to>
        <resource path="/Services" include-subpaths="true"/><!--I tried with App_Code here when renaming Services dir to App_Code with the same wain result-->
      </grant-to>
    </policy>
  </cross-domain-access>
</access-policy>

感谢您阅读

4

1 回答 1

0

在 Carlos Figueira 的这篇文章之后,这就是我最终要做的并解决了我的问题。我不确定 Silverlight 5 是否有更好的解决方案,但它对我有用。

public static void UpdateMyServiceAddress(WebServiceMyProxies.MyServiceClient client)
        {
            client.Endpoint.Address = UpdateServiceAddress(client.Endpoint.Address.Uri.ToString());
        }

private static System.ServiceModel.EndpointAddress UpdateServiceAddress(string originalAddress)
        {
            int svcIndex = originalAddress.IndexOf(".svc");
            int serviceNameIndex = originalAddress.LastIndexOf('/', svcIndex);
            string serviceName = originalAddress.Substring(serviceNameIndex + 1);

            string baseAddress = Application.Current.Host.Source.ToString();
            baseAddress = baseAddress.Substring(0, baseAddress.LastIndexOf('/')); // removing /App.xap
            baseAddress = baseAddress.Substring(0, baseAddress.LastIndexOf('/')); // removing /ClientBin

            return new System.ServiceModel.EndpointAddress(String.Format("{0}/{1}/{2}", baseAddress,"Services", serviceName));
        }
于 2013-01-26T01:20:11.273 回答