gpt4 book ai didi

wcf - 使用 IOperationBehavior 提供 WCF 参数

转载 作者:行者123 更新时间:2023-12-04 12:25:18 25 4
gpt4 key购买 nike

这是我进入 stackoverflow 世界的第一步,如果我有任何不妥之处,请见谅。

我正在尝试创建一个 WCF 操作,它的参数不暴露给外界,而是自动传递到函数中。

所以全世界都看到了:int Add(int a, int b)
但它被实现为:int Add(object context, int a, int b)
然后,上下文在运行时由系统提供。我正在使用的示例完全是人为的,但模仿了我在现实场景中研究的内容。

我能够接近,但不是完全在那里。

首先,我创建了一个简单的方法并编写了一个应用程序来确认它有效。确实如此。它返回 a + b 并将上下文作为字符串写入我的调试。好极了。

    [OperationContract]
int Add(object context, int a, int b);

然后我写了以下代码:
public class SupplyContextAttribute : Attribute, IOperationBehavior
{
public void Validate(OperationDescription operationDescription)
{
if (!operationDescription.Messages.Any(m => m.Body.Parts.First().Name == "context"))
throw new FaultException("Parameter 'context' is missing.");
}

public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
{
dispatchOperation.Invoker = new SupplyContextInvoker(dispatchOperation.Invoker);
}

public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation)
{
}

public void AddBindingParameters(OperationDescription operationDescription, BindingParameterCollection bindingParameters)
{
// Remove the 'context' parameter from the inbound message
operationDescription.Messages[0].Body.Parts.RemoveAt(0);
}
}

public class SupplyContextInvoker : IOperationInvoker
{
readonly IOperationInvoker _invoker;

public SupplyContextInvoker(IOperationInvoker invoker)
{
_invoker = invoker;
}

public object[] AllocateInputs()
{
return _invoker.AllocateInputs().Skip(1).ToArray();
}

private object[] IntroduceContext(object[] inputs)
{
return new[] { "MyContext" }.Concat(inputs).ToArray();
}

public object Invoke(object instance, object[] inputs, out object[] outputs)
{
return _invoker.Invoke(instance, IntroduceContext(inputs), out outputs);
}

public IAsyncResult InvokeBegin(object instance, object[] inputs, AsyncCallback callback, object state)
{
return _invoker.InvokeBegin(instance, IntroduceContext(inputs), callback, state);
}

public object InvokeEnd(object instance, out object[] outputs, IAsyncResult result)
{
return _invoker.InvokeEnd(instance, out outputs, result);
}

public bool IsSynchronous
{
get { return _invoker.IsSynchronous; }
}
}

我的 WCF 操作现在看起来像这样:
    [OperationContract, SupplyContext]
int Amend(object context, int a, int b);

我更新的引用不再显示“上下文”参数,这正是我想要的。

问题是每当我运行代码时,它都会超过 AllocateInputs然后抛出一个 Index was outside the bounds of the Array. WCF 胆量中的某处错误。

我尝试了其他事情,我发现我可以成功更改参数的类型并重命名它并使我的代码工作。但是当我删除参数的那一刻,它就倒下了。

任何人都可以给我一些关于如何让它工作的想法(或者它是否可以完成)。

最佳答案

嗯,我自己想出来的。 MessagePartDescription 有一个 Index 属性。我只需要重新同步这些值。

    public void AddBindingParameters(OperationDescription operationDescription, BindingParameterCollection bindingParameters)
{
var parts = operationDescription.Messages[0].Body.Parts;
parts.RemoveAt(0);
for (int i = 0; i < parts.Count; i++)
parts[i].Index = i;
}

关于wcf - 使用 IOperationBehavior 提供 WCF 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3045417/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com