问题:调用 WCF 服务时出现以下错误。
指数数组的边界之外。在 System.ServiceModel.Dispatcher.DispatchOperationRuntime.InspectInputsCore(MessageRpc& rpc) 在 System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) 在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) 在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime .ProcessMessage4(MessageRpc& rpc) 在 System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet) System.IndexOutOfRangeException
需要帮助来解决此问题。
详细信息: 我们创建了多个 Web 托管(在同一虚拟目录中,启用了 ASP.NET 兼容性,baic http 绑定)多个 WCF 服务,如下所示
6 服务,每个服务都有单独的服务合同,每个操作都有相应的数据合同。使用添加消息检查器的自定义服务主机工厂
以以下方式托管的 2 个服务 2 个单独的 wsdls(设计时文件,具有不同的模式)指向实现以下合同的相同服务端点。使用不同的自定义服务主机工厂,它还添加了消息检查器
[ServiceContract]
public interface IGenericService
{
[OperationContract(Action = "*", ReplyAction = "*")]
System.ServiceModel.Channels.Message GenericOperation(System.ServiceModel.Channels.Message msgRequest);
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall,
ValidateMustUnderstand = false)]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class GenericService : IGenericService
{
public Message GenericOperation(Message msgRequest)
{
所有这些服务在 SOA 平台中都有代理(Progress Actional)。Actional 维护用于调用实际服务的直接端点,并且能够正确调用实际服务。
在用于执行 UnitTest 的服务器中,所有 8 项服务都运行良好。当部署到 QA 服务器时,所有 6 个具有单独服务合同的服务都可以正常工作,但 2 个新服务(设计时 wsdls 文件)出现上面列出的错误。
MessageInspector(失败的服务)中的代码如下所示。其他 6 项服务的其他 Inspector 类似。
public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext)
{
return Stopwatch.StartNew();
}
public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
{
Stopwatch watch = (Stopwatch)correlationState;
watch.Stop();
TimeSpan performanceTime = watch.Elapsed;
watch = null;
// Invoke Performance Logging Code
}
}
ServiceTrace 如下所示。
构造 ServiceHost 'XyzServices.SpecificService' (具有单独服务合同的 6 个服务之一)
打开 ServiceHost 'XyzServices.SpecificService'
为特定服务打开的所有端点列表器
侦听 'specificservice uri'
处理消息 1
处理操作 'SpecificService.SpecificOperation.SoapAction'
执行 'XyzServices.SpecificService.SpecificOperation'
构造 ServiceHost 'XyzServices.GenericService'
处理消息 2
从:在“XyzServices.SpecificService 端点”
活动边界开始
到:处理操作“GenericService.GenericOperation.SoapAction”
到:在“XyzServices.SpecificService 端点”
活动边界停止
打开 ServiceHost 'XyzServices.GenericService'
为通用服务打开的所有端点列表器
处理操作“GenericService.GenericOperation.SoapAction”
来自:处理消息 2
活动边界开始
通过通道接收消息- 消息头看起来不错。不显示消息正文
ServiceChannel 信息- 这里的一切看起来都很好(单元测试服务器和 QA 服务器)
处理异常- 显示粘贴在问题详细信息中的异常(仅在 QA 服务器中)
通过通道发送消息
Aborted InstanceContext
活动边界停止
(当服务在单元测试服务器中运行时,此活动看起来很好)
我第一次使用服务跟踪查看器,但我注意到“处理消息 2”活动从与特定服务相关的活动开始。这是否表明托管服务的方式存在任何问题。(这些服务需要分离的地方)如果需要更多详细信息,请告诉我。
this.InitializeCallContext(ref rpc);
object target = rpc.Instance;
this.DeserializeInputs(ref rpc);
**this.InspectInputs(ref rpc);**
ValidateMustUnderstand(ref rpc);
IAsyncResult result = null;
IDisposable impersonationContext = null;
IPrincipal originalPrincipal = null;
bool isThreadPrincipalSet = false;
try
{
if (this.parent.SecurityImpersonation != null)
{
this.parent.SecurityImpersonation.StartImpersonation(ref rpc, out impersonationContext, out originalPrincipal, out isThreadPrincipalSet);
}
void InspectInputsCore(ref MessageRpc rpc)
{
int offset = this.Parent.ParameterInspectorCorrelationOffset;
for (int i = 0; i < this.ParameterInspectors.Length; i++)
{
IParameterInspector inspector = this.ParameterInspectors[i];
rpc.Correlation[offset + i] = inspector.BeforeCall(this.Name, rpc.InputParameters);
}
}