【发布时间】:2017-11-02 11:07:51
【问题描述】:
我们在 Windows 服务应用程序中自托管了一个 WCF Web 服务。
从 .NET winform 应用程序和 SoapUI 生成和调用一个简单的方法可以正常工作(在更改为正确的 IP 并设置身份验证标头之后)。
问题是在尝试将 WSDL 添加到 BizTalk 时,我们得到 “使用 WCF 服务元数据时出错。对象引用未设置为对象的实例” .仅此而已。
我在网上搜索过,有些人遇到了同样的问题,他们正在谈论命名空间问题。我检查了生成的 .NET winform 代理,但没有警告或任何可能暗示命名空间问题的东西?我在 WSDL 中注意到某些命名空间标签确实只有一个 "" 值,但不确定这是否有问题。
有没有什么方法可以从 Biztalk 获取更多信息,了解这个庞大的 WSDL 中的错误可能在哪里?
当从另一台计算机浏览 WSDL 时,它将使用 localhost(而不是 IP och DNS),因此我必须使用 WSDL 单一文件来生成代理,并且我必须手动将 URL 更改为客户端中的特定 IP 以获取它工作。然而,这应该不是问题。
这是服务的启动方式:
_serviceHost = new ServiceHost(typeof(T), new Uri(baseEndpoint.Address));
ServiceThrottlingBehavior throttleBehavior = new ServiceThrottlingBehavior
{
MaxConcurrentCalls = 200,
MaxConcurrentInstances = 2147483647,
MaxConcurrentSessions = 2000,
};
_serviceHost.Description.Behaviors.Add(throttleBehavior);
_serviceHost.Description.Behaviors.Add(smb.HttpGetEnabled = true);
foreach (var endpointDescription in _additionalServiceEndpoints)
{
var endpoint = new ServiceEndpoint(ContractDescription, endpointDescription.Binding, new EndpointAddress(endpointDescription.Address));
_endpointBehaviors.ForEach(c => endpoint.EndpointBehaviors.Add(c));
_serviceHost.AddServiceEndpoint(endpoint);
}
_serviceBehaviors.ForEach(c => _serviceHost.Description.Behaviors.Add(c));
ServiceAuthorizationBehavior serviceAuthorizationBehavior = _serviceHost.Description.Behaviors.Find<ServiceAuthorizationBehavior>();
if (serviceAuthorizationBehavior == null)
{
_serviceHost.Description.Behaviors.Add(new ServiceAuthorizationBehavior());
}
if (_authorizationPolicies.Count > 0)
{
serviceAuthorizationBehavior.ExternalAuthorizationPolicies = new ReadOnlyCollection<IAuthorizationPolicy>(_authorizationPolicies.ToArray());
serviceAuthorizationBehavior.PrincipalPermissionMode = PrincipalPermissionMode.Custom;
serviceAuthorizationBehavior.ServiceAuthorizationManager = new CustomServiceAuthorizationManager();
}
((ServiceBehaviorAttribute)_serviceHost.Description.Behaviors[typeof(ServiceBehaviorAttribute)]).MaxItemsInObjectGraph = 2147483647;
((ServiceBehaviorAttribute)_serviceHost.Description.Behaviors[typeof(ServiceBehaviorAttribute)]).IncludeExceptionDetailInFaults = true;
_serviceHost.Open();
【问题讨论】:
-
具体如何将 WSDL 添加到 BizTalk?你使用 Visual Studio 吗?您是否尝试过使用 WSDL Analyzer 之类的工具来验证您的 WSDL? wsdl-analyzer.com
-
我不确定如何在 BizTalk 中使用 WSDL,但我知道它在几个版本(我的 web 服务)之前运行良好。只需比较(旧的和新的)并在 WSDL 中发现问题,这些更改就很棒。 WSDL Analyzer 听起来不错,但是我的 web 服务无法从 Internet 访问,所以我必须找到一个离线 WSDL Analyzer。
-
您在问题中说您将 WSDL 添加到 BizTalk 并收到错误。你具体是怎么做的?此外,您可以从 Web 服务下载 WSDL(将 ?wsdl 附加到您的 URL)并将其上传到此类服务。
-
我没有在 www.wsdl-analyzer.com 上测试过 WSDL,唯一的警告是关于元素命名不一致,1 大驼峰和 20 小驼峰。我希望这不应该是 BizTalk 的问题。我将检查如何将 WSDL 添加到 BizTalk。
-
我现在已经检查并从 Visual Studio 中将 WSDL 添加到 Biztalk:VS > 右键单击项目(BizTalk)> 添加生成的项目。选择使用 WCF 服务 > Mex 端点并提供单个 WSDL URL。 Biztalk WCF Service Consuming Wizard 将抛出 Completing the BizTalk WCF Service Consuming: Error sumption WCF service metadata。对象引用未设置为对象的实例。
标签: c# web-services wcf wsdl biztalk