2

问题:调用 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);  
        }  
    }
4

0 回答 0