3

在我的 PowerShell 脚本中,我试图在我的 ODataServices 客户端请求中插入一个请求标头。我正在使用 Register-ObjectEvent 来做到这一点。这是一种在 .NET 中运行良好但由于某种原因在 PowerShell 中无法运行的技术我怀疑 PS 提供了对 $EventArgs 的不同访问权限

$proxy = New-ODataServiceProxy "http://localhost.:50055/Service/"

$addAuthenticationHeader =
{   
    $EventArgs.RequestHeaders.Add("X-Authorization", "Y2xhcmsua2VudEBzdXBlci5jb206c3VwZXJtYW46bWFpbg==")
}
Register-ObjectEvent -InputObject $proxy -EventName "SendingRequest" -Action $addAuthenticationHeader

$topic = New-Object -TypeName "MyServer.Entities.Topic"
$topic.Name = "hola from PS"
$topic.About = "about"

$proxy.AddObject("Topics", $topic)
$proxy.SaveChanges()

当请求在 SaveData 上发出时,其中没有添加的标头。有什么建议么?

4

1 回答 1

3

$EventArgs我修改的属性似乎没有效果,我遇到了同样的问题。我对细节不是很清楚,但是当你使用它的-Action参数时,Register-ObjectEvent它会创建一个PSEventJob来运行你的事件处理程序/ ScriptBlock。由于$addAuthenticationHeader在 a 中运行Job,我怀疑EventArgs传递给它的对象与引发事件的对象不同,因此源对象永远不会看到您所做的更改。

作为一种解决方法,我使用Add-Typecmdlet来定义一个 C# 类来执行事件处理。我不熟悉您使用的 API,但它看起来像这样:

Add-Type -TypeDefinition @"
using System;
using ProxyNamespace;

namespace StackOverflow
{
    public static class ProxyHelper
    {
        public static void RegisterSendingRequest(ProxyType proxy)
        {
            proxy.SendingRequest += Proxy_SendingRequest;
        }

        private static void Proxy_SendingRequest(object sender, ProxyEventArgs e)
        {
            e.RequestHeaders.Add(
                "X-Authorization",
                "Y2xhcmsua2VudEBzdXBlci5jb206c3VwZXJtYW46bWFpbg=="
            );
        }
    }
}
"@ -ReferencedAssemblies $ProxyAssemblyPath;

您需要用适当的值替换ProxyNamespaceProxyTypeProxyEventArgs$ProxyAssemblyPath,然后只需替换它...

$addAuthenticationHeader =
{   
    $EventArgs.RequestHeaders.Add("X-Authorization", "Y2xhcmsua2VudEBzdXBlci5jb206c3VwZXJtYW46bWFpbg==")
}
Register-ObjectEvent -InputObject $proxy -EventName "SendingRequest" -Action $addAuthenticationHeader

...有了这个...

[StackOverflow.ProxyHelper]::RegisterSendingRequest($proxy);
于 2013-09-17T21:17:05.263 回答