EWS(Exchange Web Service) 身份验证与 Exchange Server 2013



我是使用 c# 和 exchange Web 服务的新用户,遇到了问题。 我正在尝试做的是将约会添加到 Outlook 日历中。

    ExchangeService service = null;
    public WebService1()
    {
        service = new ExchangeService(ExchangeVersion.Exchange2013);
        service.UseDefaultCredentials = false;
        service.Credentials = new WebCredentials("user1@mydomain`enter code here`.com", "password");

        service.TraceEnabled = true;
        service.TraceFlags = TraceFlags.All;
        ServicePointManager.ServerCertificateValidationCallback = CertificateValidationCallBack;


        service.Url = new Uri("https://mydomain/EWS/Exchange.asmx");
        service.TraceListener = new TraceListener();
    // Optional flags to indicate the requests and responses to trace.
        service.TraceFlags = TraceFlags.All;
        service.TraceEnabled = true;
        service.TraceListener.Trace("begin", service.HttpHeaders.ToString());}
       [WebMethod]
        public string addMeeting(string userNameList, string subject, string content, string beginDate, string endDate, string location="", string optionalUserList="", string remindTime="")
    {
        try
        {
            Appointment meeting = Appointment.Bind(service, new ItemId("meeting"));
            if (userNameList == "")
            {
                return "FAIL: NO USER IS ADDED! PLEASE CHECK AGAIN!";
            }
            meeting.Subject = subject.Trim() == "" ? "未知主题" : subject;
            meeting.Body = content.Trim() == "" ? "未知内容" : content;
            meeting.Start = DateTime.Parse(beginDate);
            meeting.End = DateTime.Parse(endDate);
            meeting.Location = location == "" ? "未知地点" : location;
            string[] userListArr = userNameList.Split(new Char[] { ';', ',' });
            foreach (string s in userListArr)
            {
                if (s.Trim() != "")
                {
                    meeting.RequiredAttendees.Add(s);
                }
            }
            string[] opUserListArr = optionalUserList.Split(new Char[] { ';', ',' });
            foreach (string s in opUserListArr)
            {
                if (s.Trim() != "")
                {
                    meeting.OptionalAttendees.Add(s);
                }
            }
            remindTime = remindTime.Trim() == "" ? "60" : remindTime;
            meeting.ReminderMinutesBeforeStart = int.Parse(remindTime);
            meeting.Save(SendInvitationsMode.SendToAllAndSaveCopy);
            return "SUCCESS";
        }
        catch (Exception ex)
        {
            return ex.Message + "n" + ex.StackTrace + "nn" + ex.Source +" n" + ex.ToString();
        }
    }

当我在 VISIO Studio 中调试它,然后将其放入 IIS 时,这效果很好,没有任何进展!我发现在交换服务器上的日志文件中,记录了错误代码 401。然后我发现ews的身份验证设置为"base,NTLM,Windows身份验证,Windows SharePoint安全,OAuth"。

我问如何更改我的代码以获得这些身份验证。谢谢!


原谅我糟糕的英语。

最后我得到了这段代码!起初,我的代码是这样的:

service.Credentials = new NetCredential("Domain\myUserName", "password");

它在 visio 工作室中运行良好,因为交换对 visio studio 的请求做了一些特殊的事情,即它忽略了身份验证部分。因此,当我将其放入 IIS 中时,这不起作用,因为凭据不正确!

所以我把我的代码改成这样:

service.Credentials = new NetCredential("myUserName", "password", "Domain");

你猜怎么着?成功了!

我花了两天时间才终于解决这个问题,真是个错误!

====

====================================================================

在我阅读了 msdn 上的 api 文档后,我发现第一个不起作用的原因是因为在基本身份验证中使用了两个参数方法,而具有三个参数的方法用于标识 NTLM 身份验证。

最新更新