代码之家  ›  专栏  ›  技术社区  ›  pencilslate

Silverlight忽略web.config文件中的wcf路径

  •  0
  • pencilslate  · 技术社区  · 15 年前

    我正在编写一个调用WCF服务的Silverlight应用程序。

    另一个解决方案包含以下Silverlight项目:
    -用于托管Silverlight应用程序的Web项目
    -Silverlight应用程序项目
    -具有对WCF的服务引用的Silverlight类库项目

    当我在本地主机上运行Silverlight应用程序时,Silverlight使用本地主机调用WCF并正常工作。

    然后我发布了服务和Web应用程序,并将其部署到另一台服务器上。web.config文件已修改为指向已部署的端点地址。

    现在,运行Silverlight应用程序会查找服务的本地主机URL,尽管web.config中的端点是已部署服务器的端点。

    Silverlight应用程序从何处查找SVC URL? 它似乎没有从web.config文件中读取。但是,似乎更像是在生成/发布过程中将URL嵌入到程序集中。

    有什么想法吗??

    谢谢你的阅读!

    2 回复  |  直到 14 年前
        1
  •  4
  •   Clay Fowler    15 年前

    Silverlight应用程序根本看不到托管服务器的web.config-它位于服务器端,对客户端上运行的Silverlight应用程序不可见。Silverlight应用程序在自己的servicereferences.clientconfig文件中或在用代码创建本地服务代理时以编程方式指定的URL中查找。

    因此,您有两种选择:
    1。在构建Silverlight应用程序的可部署版本之前,请修改servicereferences.clientconfig。
    2。使用代码构造具有URL的客户端端点。

    我们使用第二个选项是因为我们希望有一个配置端点的标准编程接口。我们会这样做(当然,如果MaxValue是面向公众的服务,则不会这样做):

            public ImportServiceClient CreateImportServiceClient()
            {
                return new ImportServiceClient(GetBinding(), GetServiceEndpoint("ImportService.svc"));
            }
    
            public ExportServiceClient CreateExportServiceClient()
            {
                return new ExportServiceClient(GetBinding(), GetServiceEndpoint("ExportService.svc"));
            }
    
            protected override System.ServiceModel.Channels.Binding GetBinding()
            {
                BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.None);
                binding.MaxBufferSize = int.MaxValue;
                binding.MaxReceivedMessageSize = int.MaxValue;
                binding.SendTimeout = TimeSpan.MaxValue;
                binding.ReceiveTimeout = TimeSpan.MaxValue;
                return binding;
            }
    
            protected EndpointAddress GetServiceEndpoint(string serviceName)
            {
                if (Settings == null)
                {
                    throw new Exception("Service settings not set");
                }
                return
                    new EndpointAddress(ConcatenateUri(Settings.ServiceUri,serviceName));
            }
    
            protected EndpointAddress GetServiceEndpoint(string serviceName, Uri address)
            {
                if (Settings == null)
                {
                    throw new Exception("Service settings not set");
                }
                return new EndpointAddress(ConcatenateUri(address, serviceName));
            }
    

    “importServiceClient”和“exportServiceClient”等类是从创建对WCF服务的服务引用中生成的代理。settings.serviceuri是我们存储要与之交谈的服务器地址的地方(在我们的示例中,它是通过托管在其中的页面中的Silverlight插件的参数动态设置的,但是您可以使用任何您喜欢的方案来管理此地址)。

    但是如果您只想调整servicereferences.clientconfig,那么您不需要这样的代码。

        2
  •  1
  •   fresky    14 年前

    我在托管Silverlight的ASP页中使用Silverlight对象的initparams来传递WCF服务URL。您可以从ASP页面的web.config获取URL。在我的情况下是可行的。