SSIS脚本任务与Microsoft.Exchange.WebServices

3

这可能是this帖子的重复问题,但我的错误不同且难以理解。

目前,我有一个只包含脚本任务的SSIS包。在该脚本任务内部,我已经引用了Microsoft.Exchange.WebServices.dll并将其包含在命名空间中。

每当我不使用WebServices中定义的任何方法和类时,脚本都可以完美运行。但是,每当我确实使用它们时,整个脚本都会失败,甚至无法到达第一行断点...它还会抛出以下错误:

at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments) at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) at System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams) at Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTATaskScriptingEngine.ExecuteScript()

有什么想法吗?当我在这个SSIS脚本任务之外运行相同的代码(在其自己的项目中)时,它可以正常工作。

更新

我正在更新此帖子以包含更多可能有用的信息。我的脚本任务中的代码如下:

public void Main()
{
    string _SharedBox = "user@domain.com";
    ExchangeService service = new ExchangeService();
    service.AutodiscoverUrl(_SharedBox);
    service.UseDefaultCredentials = true;
    //... goes on, but the rest is commented out for now.
}

我认为可能没有正确包含Microsoft.Exchange.WebServices,这可能是问题所在,但我不确定出了什么问题。我有一个DLL文件放在VS解决方案内,但在SSIS项目外。然后我将它作为Script Task的引用添加进去 - 这是我不确定的部分。我最初尝试通过NuGet包含WebServices,但是我意识到不能在Script Task中使用NuGet。下面是Script Task中我的解决方案:

enter image description here

提前感谢任何帮助!


“整个脚本都失败了,甚至无法在第一行的断点处停止”意味着脚本在验证阶段(或PreExecute阶段)失败,您必须提供脚本代码和真实的错误消息,因为您提供的是错误StackTrace而不是消息。 - Hadi
@Hadi,当我运行它时,我收到的唯一其他消息是:目标调用引发了异常。我不确定还有哪里可以查找此脚本产生的错误。我将更新我的帖子并添加脚本任务中的代码。 - Darryl Huffman
@DarrylHuffman 只需按提供的答案所述,在 service.AutodiscoverUrl(_SharedBox); 之前移动 service.UseDefaultCredentials = true; 即可。 - Yahfoufi
1个回答

0

更新 1

尝试两件事情:

  • 以 32 位模式运行包 (因为可能只有 32 位程序集在 GAC 中注册。)
  • Microsoft.Exchange.WebServices.dllCopy Local 属性设置为 True

读取主要异常

根据您的评论,抛出的异常是:

目标调用引发了异常

这是一个常见的错误消息,当脚本代码引发异常时会显示。要读取主要的错误消息,您可以在代码中添加 try catch 语句,并使用 Dts.FireError() 方法来抛出真正的异常。

public void Main()
{
    try{

        string _SharedBox = "user@domain.com";
        ExchangeService service = new ExchangeService();
        service.AutodiscoverUrl(_SharedBox);
        service.UseDefaultCredentials = true;
        //... goes on, but the rest is commented out for now.
        Dts.TaskResult = (int)ScriptResult.Success;

    }catch(Exception ex){

        Dts.FireError(0,"An error occured", ex.Message,String.Empty, 0);
        Dts.TaskResult = (int)ScriptResult.Failure;

    }


}

尝试找出问题

搜索了一段时间后,我认为异常是在以下行抛出的:

service.AutodiscoverUrl(_SharedBox);

尝试在service.AutodiscoverUrl(_SharedBox);之前放置service.UseDefaultCredentials = true;,因为在使用AutoDiscoverUrl()方法之前必须定义凭据。

此外,您可以查看以下链接,它可以为您提供有关使用ExchangeService读取电子邮件的更多信息:


感谢您的帮助。不幸的是,我不认为这是问题所在... 它似乎甚至没有执行到足够的程度才能进入异常。这让我想知道是否能够在 SSIS 脚本任务中添加对 DLL 的引用。一旦我使用 Microsoft.Exchange.WebServices 命名空间中的任何方法,任务就会抛出异常,而没有任何详细信息。我尝试添加 Dts.Events.FireError,但由于脚本实际上并未运行,它似乎没有冒泡任何内容。 - Darryl Huffman
@DarrylHuffman 尝试以32位模式运行程序包,也许这是一个64位问题,dll没有注册。 - Hadi
@DarrylHuffman 你尝试以32位模式运行软件包了吗? - Hadi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接