2013-05-09 114 views
0

我有一个带有许多用户控件的仪表板项目。本周,我创建了一个不仅仅是用户控件而且将它集成到仪表板应用程序中的应用程序,这看起来很痛苦。于是我寻找解决方案并找到了MEF和PRISM。 MEF似乎比PRISM容易一些,我开始用this教程做一个Hello World MEF应用程序。它进行得很顺利,我成功地注入了一个Hello World xap。带WCF服务的Silverlight MEF

之后,我试图注入我真正的应用程序,并遇到一些问题。我想指出我解决的问题,因为我可能以错误的方式解决它们,或者它们可能是我当前问题的原因。

注意:我的应用程序使用启用Silverlight的WCF Web服务来检索数据。

第一问题

ServiceReferences.ClientConfig未在XAP包中找到。 我将这个文件作为链接添加到我的MEF项目客户端。问题解决了。

第二问题

我使用我的客户机端将Settings.xml持有端点,如:

<?xml version="1.0" encoding="utf-8" ?> 
<Services> 
    <Service Name="MyService"> 
    <HostPath Name="/ClientBin/MyComponent.xap"> 
     <Endpoint Url="/MyService.svc"></Endpoint> 
    </HostPath> 
    <HostPath Name="MyComponent.Web/ClientBin/MyComponent.xap"> 
     <Endpoint Url="MyComponent.Web/MyService.svc"></Endpoint> 
    </HostPath> 
    </Service> 
</Services> 

和阅读这让WCF Web Service的服务客户与我的2个功能它们是:

public MyServiceClient GetMyServiceClient() 
    { 
     if (serviceClient == null) 
     { 
      serviceClient = new MyServiceClient(); 
      Uri uriEndpointAddress = serviceClient.Endpoint.Address.Uri; 
      UriBuilder ub = new UriBuilder(uriEndpointAddress) 
      { 
       Host = Application.Current.Host.Source.Host, 
       Path = 
        GetURLForService("MyService", 
            Application.Current.Host.Source.AbsolutePath) 
      }; 
      serviceClient.Endpoint.Address = new System.ServiceModel.EndpointAddress(ub.Uri); 
     } 
     return serviceClient; 
    } 

private string GetURLForService(string ServiceName, string HostURL) 
    { 
     string retval = ""; 
     XDocument doc = XDocument.Load("Settings.xml"); 
     if (doc.Root != null) 
     { 
      XElement elmService = doc.Root.Elements("Service").FirstOrDefault(c => 
      { 
       XAttribute xAttribute = c.Attribute("Name"); 
       return xAttribute != null && xAttribute.Value.ToLower() == ServiceName.ToLower(); 
      }); 
      if (elmService != null) 
      { 
       XElement elmHostPath = elmService.Elements("HostPath").FirstOrDefault(c => 
       { 
        XAttribute xAttribute = c.Attribute("Name"); 
        return xAttribute != null && xAttribute.Value.ToLower() == HostURL.ToLower(); 
       }); 
       if (elmHostPath != null) 
       { 
        retval = elmHostPath.Element("Endpoint").Attribute("Url").Value; 
       } 
      } 
     } 

     return retval; 
    } 

我已经添加了我的Settings.xml文件作为链接也解决了问题。

主要问题

解决这两个问题之后,我遇到的主要问题。 远程服务器返回错误:NotFound。

我甚至在我将Settings.xml试过这样:

<HostPath Name="/MEFHubApp/ClientBin/MyComponent.xap"> 
    <Endpoint Url="/MyComponent.Web/MyService.svc"></Endpoint> 
</HostPath> 

我MEF的应用程序无法找到/用我的网络服务,无论我怎么努力。

谢谢

+0

在IE9 +(F12)中启动开发工具并开始捕获网络流量。查看正在发送的请求。如果请求构造不正确 - 那么这就是客户端问题 - 开始调试客户端。如果请求看起来正确 - 那么这是一个服务器问题 - 开始调试服务器。 “NotFound”在许多不同情况下都会返回,您需要缩小这个范围。 – boris 2013-05-09 15:18:31

+0

只是任何人阅读这篇文章,我不知道如何“添加为链接”。这篇文章解释得很好... http://www.global-webnet.net/blogengine/post/2009/01/03/PrismWCF-Cannot-find-ServiceReferencesClientConfig-in-xap-application-package.aspx 节选:转到主程序集(在我们的例子中为SDMS.Silverlight),并添加一个现有项目 - 粘贴完整的ClientConfig文件路径,然后单击“添加”按钮上的向下三角形并选择“添加链接” – Nexxas 2015-07-23 15:01:52

回答

0

我找到了我的问题的解决方案。所以在这里,如果有人遇到相同的:

而不是我的GetMyServiceClient() from settings.xml。我初始化我的服务的客户是这样的:

MyServiceClient client = new MyServiceClient("MyService_CustomBinding"); 

参数是我在ServiceReferences.ClientConfig结合,瞧它的工作就像一个魅力!