[AX]AX2012 C#使用IIS宿主AIF服务的一些问题

AIF的服务可以是宿主在AOS,使用NetTcp适配器;也可以是宿主在IIS,使用HTTP适配器,两种方式都可以在C#工程中添加Service reference来调用这些服务。配置及使用NetTcp适配器服务相对简单,测试过程中也没有遇到太多的问题。而IIS宿主则复杂不少,首先要需要安装Web service on IIS组件,IIS配置中设置相应的应用程序等,在参照MSDN演练(http://msdn.microsoft.com/EN-US/library/hh496418.aspx)测试时确实遇到了不少的问题,就一些需要注意的地方总结一下。

首先C#工程需要使用.net framework 3.5及以上版本,否则在工程中你可能只会看到“Add web reference”而不是“Add service reference”,后者兼容前者,遵循WCF框架规则,所以建议使用“Add service reference”。

在“Add service referece”添加引用到工程时遇到的第一个问题是会弹出登录对话框提示输入用户名密码,输入有效的域用户密码后却没有效果,总是不断的提示输入用户名密码。查看服务IIS身份验证的配置,默认只启用了Windows身份验证,尝试启用“匿名身份验证”后可以浏览到相关服务,虽然也弹出对话框提示“'http://dax/MicrosoftDynamicsAXAif60/WebSalesOrderRead/xppservice.svc/$metadata' requires a username and password.”输入用户名密码,但是可以成功添加Service reference。拷贝粘贴演练提供的代码,可以成功编译运行,又出现这样的异常:

“"The HTTP request is unauthorized with client authentication scheme 'Negotiate'. The authentication header received from the server was 'Negotiate oWkwZ6ADCgEBomAEXmBcBgkqhkiG9xIBAgIDAH5NMEugAwIBBaEDAgEepBEYDzIwMTMwMTI5MDUxOTUxWqUFAgMGkJWmAwIBKakNGwtLUkFJQlVSRy5DTqoRMA+gAwIBAaEIMAYbBGRheCQ='."”

这是客户端不能被IIS认证,也是WCF中经常遇到的问题,网上的解决办法也是五花八门,测试有效的解决办法有:

一是修改客户端绑定的安全模型,修改app.config相关的内容为:

      <security mode="TransportCredentialOnly">
                <transport clientCredentialType="Ntlm" proxyCredentialType="None"
                       realm="" />
                 <message clientCredentialType="UserName" algorithmSuite="Default" />
          </security>

原来“Ntlm”的地方是默认生成的“Windows”,强制为Ntlm后可以成功读取AX数据。

第一种方法虽然奏效,但是依然无法解决上述添加Service reference时弹出登录对话框的问题,在查阅很多网页后发现关于IIS宿主WCF身份验证有一篇十分详细的测试:http://blogs.msdn.com/b/distributedworld/archive/2012/04/24/troubleshoot-kerberos-in-wcf.aspx,剩下要做的也很简单了,找到IIS服务应用程序MicrosoftDynamicsAXAif60->身份验证->Windows身份验证->高级设置,去掉那个“启用内核模式身份验证”这个神秘而纠结的勾吧,iisreset后测试程序一切正常,那个“匿名身份验证”也可以关掉了。

原文地址:https://www.cnblogs.com/duanshuiliu/p/2881302.html