Microsoft Dynamics Nav(Navision)使用BCS与Sharepoint 2010集成

时间:2012-09-11 12:14:38

标签: sharepoint-2010 external dynamics-nav contenttype dynamics-nav-2009

我正在尝试使用外部内容类型将Microsoft Dynamics Nav 2009 R2(Navision)与Sharepoint 2010集成。我对Dynamics Nav和Sharepoint 2010中的Buisness Connectivity Service都很陌生,我无法让它发挥作用。

我知道您可以将Dynamics Nav中的页面作为Web服务发布,并且我已将其中一个演示页面作为Web服务发布,并使用Visual Studio成功连接到它(将其添加为Web引用)。我已经以编程方式调用了add和delete方法,并且工作正常。

我打开了sharepoint设计器并尝试添加外部内容类型。我将“数据源类型”设置为“WCF服务”,并在“服务元数据URL”和“服务端点URL”中将URL用于Web服务(http:// devel:7047 / DynamicsNAV / WS / Page / Customer) ”。当我尝试连接到Web服务时,我收到错误消息“无法找到任何匹配的端点配置”。

就像我之前所说,我对SharePoint中的Microsoft Dynamics Nav和外部内容类型都很陌生。有关Dynamics Nav和Sharepoint集成的信息很难找到,我感觉有点迷失。如果有人能够了解如何使用BCS将Dynamics Nav与SharePoint集成,那将非常感激。

1 个答案:

答案 0 :(得分:1)

你必须原谅我,因为虽然我对NAV网络服务有所了解,但我对Sharepoint和BCS几乎一无所知。

然而,话虽如此,我确实有一些建议可能会有所帮助:首先,NAV Web服务是在WCF上构建的,并使用BasicHttpBinding。如果您对如何将WCF BasicHttpBinding服务连接到BCS进行一些研究,那么您可能会获得一些牵引力。任何标准的BasicHttpBinding服务和特定于NAV的Web服务之间没有根本区别。

您还提到您可以使用Web引用在Visual Studio中成功连接到NAV Web服务。但是,Web引用代理是使用较旧的“wsdl.exe”实用程序构建的,因此只能使用传统的SOAP Web服务。虽然BasicHttpBinding服务完全向后兼容SOAP Web服务,但仍然存在缺少任何WCF服务独有的配置设置的问题。您可能真的想考虑在visual studio中使用服务引用,并弄清楚如何使其与您发布的NAV Web服务一起正常工作。有了它,您可以使用生成的配置设置来了解sharepoint设计器中缺少的内容。我的猜测是缺少“端点配置”错误告诉您,在很多的情况下,在使用WCF代理连接到NAV Web服务之前,sharepoint设计器中需要一些特定于WCF的设置。例如,它可能位于安全领域,因为WCF为您提供了比传统SOAP更精细的控制级别。同样,我认为关键是要记住sharepoint需要一个正确配置的WCF端点,而旧的Web引用则不需要。这可能就是为什么你可以让它在visual studio中工作而不是在sharepoint designer中工作。

只是为了给你一个想法(不是“最佳实践”的教训),当我在我的NAV项目中创建服务引用代理时,我经常尝试使用基于代码的配置而不是过于冗长的基于文件的配置(特别是因为我们无论如何都无法控制NAV服务层端点绑定)。我使用类似于此的代码来创建客户端连接(当然这只是伪代码并且不会编译,例如,您需要指向实际的服务引用客户端代理类,但这应该给您一个想法哪个WCF绑定配置参数是必要的):

    using System.Security.Principal;
    using System.ServiceModel;

    private void TestNavConnection(string url)
    {
        using (var ws = new NavServiceReference(GetBindingTransportCredentialOnly(), new EndpointAddress(url)))
        {
            ws.ClientCredentials.Windows.AllowNtlm = true;
            ws.ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Delegation;
            var record = ws.Read("XYZ");
        }
    }

    private static BasicHttpBinding GetBindingTransportCredentialOnly()
    {
        var binding = new BasicHttpBinding();
        binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
        binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows;
        binding.MaxReceivedMessageSize = 1048576;
        return binding;
    }

希望这会有所帮助。祝你好运!