C# 使用WCF服务元数据时出错?

C# 使用WCF服务元数据时出错?,c#,web-services,wcf,wsdl,biztalk,C#,Web Services,Wcf,Wsdl,Biztalk,我们在windows服务应用程序中有一个WCF webservice自托管 从.NET winform应用程序和SoapUI生成并调用一个简单方法(在更改IP和设置身份验证头之后)效果良好 问题在于,当尝试将WSDL添加到BizTalk时,我们会得到“使用WCF服务元数据时出错。对象引用未设置为对象的实例”。没别的了 我在互联网上搜索过,有一些人也有同样的问题,他们正在讨论名称空间问题。我已检查生成的.NET winform代理,但没有任何警告或任何可能表明名称空间存在问题的内容?我在WSDL中

我们在windows服务应用程序中有一个WCF webservice自托管

从.NET winform应用程序和SoapUI生成并调用一个简单方法(在更改IP和设置身份验证头之后)效果良好

问题在于,当尝试将WSDL添加到BizTalk时,我们会得到“使用WCF服务元数据时出错。对象引用未设置为对象的实例”。没别的了

我在互联网上搜索过,有一些人也有同样的问题,他们正在讨论名称空间问题。我已检查生成的.NET winform代理,但没有任何警告或任何可能表明名称空间存在问题的内容?我在WSDL中注意到,一些名称空间标记只有一个“”值,但不确定这是否是一个问题

是否有任何方法可以从Biztalk获取更多有关此大规模WSDL中的错误位置的信息

当从另一台计算机浏览WSDL时,它将使用localhost(而不是IP och DNS),因此我必须使用WSDL SingleFile来生成代理,并且我必须手动将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();
\u serviceHost=newservicehost(typeof(T),newuri(baseEndpoint.Address));
ServiceThrottlingBehavior throttleBehavior=新的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=新的ServiceEndpoint(ContractDescription,endpointDescription.Binding,新的EndpointAddress(endpointDescription.Address));
_ForEach(c=>endpoint.endpointBehaviors.Add(c));
_AddServiceEndpoint(端点);
}
_serviceBehaviors.ForEach(c=>\u serviceHost.Description.Behaviors.Add(c));
ServiceAuthorizationBehavior ServiceAuthorizationBehavior=\u serviceHost.Description.Behaviors.Find();
如果(serviceAuthorizationBehavior==null)
{
_serviceHost.Description.Behaviors.Add(新的ServiceAuthorizationBehavior());
}
如果(_authorizationPolicies.Count>0)
{
serviceAuthorizationBehavior.ExternalAuthorizationPolicys=new ReadOnlyCollection(_AuthorizationPolicys.ToArray());
serviceAuthorizationBehavior.PrincipalPermissionMode=PrincipalPermissionMode.Custom;
serviceAuthorizationBehavior.ServiceAuthorizationManager=新的CustomServiceAuthorizationManager();
}
((ServiceBehaviorAttribute)_serviceHost.Description.Behaviors[typeof(ServiceBehaviorAttribute)]).MaxItemsInObjectGraph=2147483647;
((ServiceBehaviorAttribute)_serviceHost.Description.Behaviors[typeof(ServiceBehaviorAttribute)])。IncludeExceptionDetailInFaults=true;
_Open();

您是否尝试过本论坛帖子中描述的解决方案:

它指向位于以下位置的博客帖子:

解决方案可能是(从上面的链接):

1、使用svcutil工具生成WSDL和XSD文件

svcutil.exe/t:元数据

2、验证WSDL文件中的节点,确保该节点具有目标命名空间定义。使用什么属性值并不重要,可能只是看起来像http://any.

3,选择元数据文件(WSDL和XSD)作为源


4,一切都应该很好。

我在尝试使用.svc?singleWsdl时遇到了相同的错误。当我在“添加生成的项”向导中使用just.svc时,它就会工作。

您如何具体地将WSDL添加到BizTalk?你使用visualstudio吗?您是否尝试过使用WSDL Analyzer之类的工具来验证您的WSDL?我不确定WSDL在BizTalk中是如何使用的,但我知道它在几个版本(我的Web服务)之前运行良好。只要比较(旧的和新的)并在WSDL中发现问题,这些变化就太棒了。WSDL分析器听起来不错,但我的Web服务无法从internet访问,因此我必须找到一个脱机WSDL分析器。您在问题中说您将WSDL添加到BizTalk并得到错误。你具体是怎么做到的?此外,您可以从web服务下载WSDL(将?WSDL附加到URL)并将其上载到这样的服务。我没有在www.WSDL-analyzer.com中测试WSDL,唯一的警告是关于元素命名不一致,1个大写字母和20个小写字母。我希望这不应该是BizTalk的问题。我将检查WSDL是如何添加到BizTalk的。我现在已经检查了,并且WSDL是从Visual Studio中添加到BizTalk的:VS>右键单击项目(BizTalk)>添加Generated项。选择consume WCF service>Mex endpoint并提供单个WSDL URL。Biztalk WCF服务使用向导将在完成Biztalk WCF服务使用时引发错误:使用WCF服务元数据时出错。对象引用未设置为对象的实例。用户已对此进行了测试,但我将仔细查看。生成并修改WSDL,然后让用户在Biztalk中使用它。在检查Myservice WSDL文件时,我可以看到XSD:schema有一个targetNameSpace。在此之后,我得到了一些导入,其中一个没有名称空间集。我不知道我应该在这里设置什么名称空间?如果我访问导入,我可以看到xs:schema没有任何targetnamespace或namespace?这可能是问题所在吗?它确实有一个到?xsd=xsd0的导入,它有一个名称空间。