带有WCF服务的Silverlight MEF

本文关键字:Silverlight MEF 服务 WCF 带有 | 更新日期: 2023-09-27 18:13:00

我有一个带有许多用户控件的仪表板项目。本周我创建了一个不仅仅是用户控件的应用程序,将它集成到我的仪表板应用程序中似乎很痛苦。于是我寻找解决方案,找到了MEF和PRISM。MEF看起来比PRISM简单一点,我开始用这个教程做一个Hello World MEF应用程序。我成功地注入了一个Hello World xap。

之后我尝试注入我的实际应用程序,遇到了一些问题。我想指出我解决过的问题,因为我可能用错误的方法解决了它们,或者它们可能是我现在问题的原因。

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

第一个问题

ServiceReferences。在xap包中找不到ClientConfig。我添加了这个文件作为链接到我的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服务客户端与我的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文件作为链接,问题也解决了。

<<p> 主要问题/strong>

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

我甚至在我的Settings.xml中尝试过:

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

我的MEF应用程序无法找到/使用我的web服务,无论我怎么尝试。

谢谢

带有WCF服务的Silverlight MEF

我找到了解决问题的方法。所以如果有人遇到同样的情况:

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

MyServiceClient client = new MyServiceClient("MyService_CustomBinding");

参数是我在servicerreferences中的绑定。ClientConfig,瞧,它工作得很好!