Sharepoint 2010 使用BCS将Microsoft Dynamics导航(Navision)与Sharepoint 2010集成

Sharepoint 2010 使用BCS将Microsoft Dynamics导航(Navision)与Sharepoint 2010集成,sharepoint-2010,external,dynamics-nav,contenttype,dynamics-nav-2009,Sharepoint 2010,External,Dynamics Nav,Contenttype,Dynamics Nav 2009,我正在尝试使用外部内容类型将Microsoft Dynamics Nav 2009 R2(Navision)与Sharepoint 2010集成。我对Dynamics Nav和Sharepoint 2010中的商业连接服务都很陌生,但我无法让它工作 我知道您可以将Dynamics Nav中的页面发布为web服务,我已将其中一个演示页面发布为web服务,并已使用Visual Studio成功连接到它(将其添加为web参考)。我以编程方式调用了add和delete方法,效果很好 我打开sharepo

我正在尝试使用外部内容类型将Microsoft Dynamics Nav 2009 R2(Navision)与Sharepoint 2010集成。我对Dynamics Nav和Sharepoint 2010中的商业连接服务都很陌生,但我无法让它工作

我知道您可以将Dynamics Nav中的页面发布为web服务,我已将其中一个演示页面发布为web服务,并已使用Visual Studio成功连接到它(将其添加为web参考)。我以编程方式调用了add和delete方法,效果很好

我打开sharepoint designer并尝试添加外部内容类型。我将“数据源类型”设置为“WCF服务”,并使用web服务的url(http://devel:7047/DynamicsNAV/WS/Page/Customer)在“服务元数据Url”和“服务端点Url”中。当我尝试连接到web服务时,我得到一个错误,说“找不到任何匹配的端点配置”


如前所述,我对SharePoint中的Microsoft Dynamics Nav和外部内容类型都非常陌生。关于Dynamics Nav和Sharepoint集成的信息很难找到,我感到有点迷茫。如果有人能告诉我如何使用BCS将Dynamics Nav与SharePoint集成,我将不胜感激。

您必须原谅我,因为虽然我对Nav web services有所了解,但我对SharePoint和BCS几乎一无所知

尽管如此,我还是有一些建议可能会有所帮助:首先,NAV web服务是基于WCF构建的,并使用BasicHttpBinding。如果您对如何将WCF BasicHttpBinding服务连接到BCS进行一些研究,您可能会得到一些启发。任何标准的BasicHttpBinding服务和特定于NAV的web服务之间没有根本区别

您还提到,您能够使用web引用成功地连接到VisualStudio中的NAV web服务。但是,web引用代理是使用较旧的“wsdl.exe”实用程序构建的,因此只能使用经典的SOAP web服务。虽然BasicHttpBinding服务与SOAP web服务完全向后兼容,但仍然存在缺少任何WCF服务所特有的配置设置的问题。您可能真的想考虑在VisualStudio中使用服务引用,并考虑如何使用已发布的NavWeb服务使其正确工作。这样,您就可以使用生成的配置设置来了解sharepoint designer中缺少的内容。我的猜测是,丢失的“端点配置”错误告诉您,在使用WCF代理连接到NAV web服务之前,sharepoint designer中需要一些特定于WCF的设置。例如,它可能在安全领域,因为WCF提供了比经典SOAP更细粒度的控制。同样,我认为关键是要记住,sharepoint需要一个正确配置的WCF端点,而旧的web引用则不需要。这可能就是为什么您可以在VisualStudio而不是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;
    }