在ASP.NET中使用Exchange Web Service(EWS)调用失败,但在控制台应用程序中不会失败。

4

当我尝试通过ASP.NET连接Exchange Web Services时,出现了错误。

如果我在控制台应用程序中调用以下代码,则代码有效,但是在执行ASP.NET Web表单页面时,相同的代码失败。值得一提的是,我在整个代码示例中都使用了自己的凭据。

“当作为没有邮箱的帐户发出请求时,您必须为任何专用文件夹ID指定邮箱主SMTP地址。”

我认为通过指定模拟用户可以解决此问题。

exchangeservice.ImpersonatedUserId = 
    new ImpersonatedUserId(ConnectingIdType.SmtpAddress, "email@domain.com");

但是我得到了一个不同的错误。

"该帐户没有权限模拟请求的用户。"

Web应用程序正在运行的应用程序池也是我的帐户(与控制台应用程序相同),因此我不知道可能会导致这个问题。

我正在使用.NET框架3.5。

以下是完整的代码。

var exchangeservice =
                        new ExchangeService(ExchangeVersion.Exchange2010_SP1)
                        {
                            Timeout = 10000
                        };

 var credentials = new System.Net.NetworkCredential("username", "pass", "domain");


exchangeservice.AutodiscoverUrl("email@domain.com")

FolderId rootFolderId = new FolderId(WellKnownFolderName.Inbox);

var folderView = new FolderView(100)
            {
                Traversal = FolderTraversal.Shallow
            };

            FindFoldersResults findFoldersResults =
                service.FindFolders(rootFolderId, folderView);

当您在两个环境下运行时,设置的URL是否与服务匹配? - Rich Andrews
这是我的本地开发环境,所以我看不到任何连接问题阻止我。 - Razor
我知道,但是如果您在自动发现之后设置断点,您可以看到“已发现”的URL作为服务中的属性。我曾经遇到过一些自动发现的问题,在某些环境中它会解析到错误的代理。这可能没有帮助,但检查是否连接到相同的终端点总是一个好主意。 - Rich Andrews
感谢您的帮助@RichAndrews。AutoDiscoverUrl是{https://webmail.domain.com.au/ews/exchange.asmx}。这是正确的URL。 - Razor
可能是打错了,但实际上你并没有在任何地方使用"credential"变量。你需要在"service"对象上设置凭据。 - Jakob Christensen
显示剩余2条评论
2个回答

1

你尝试过直接针对服务设置凭据吗?

this.exchangeService.Credentials = new WebCredentials("username", "pass");

this.exchangeService.AutodiscoverUrl("username", this.RedirectionUrlValidationCallback);

并将其用作验证回调函数..

    /// <summary>
    /// Redirections the URL validation callback.
    /// </summary>
    /// <param name="redirectionUrl">The redirection URL.</param>
    /// <returns>true if https</returns>
    private bool RedirectionUrlValidationCallback(string redirectionUrl)
    {
        // The default for the validation callback is to reject the URL.
        var result = false;

        var redirectionUri = new Uri(redirectionUrl);

        // Validate the contents of the redirection URL. In this simple validation
        // callback, the redirection URL is considered valid if it is using HTTPS
        // to encrypt the authentication credentials. 
        if (redirectionUri.Scheme == "https")
        {
            result = true;
        }

        return result;
    }

1

检查凭据并查看用户是否具有足够的权限进行模拟。检查EWS限制策略并提供正确的权限即可解决问题。


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