ExchangeServiceBinding,EWS,Exchange Web服务 [英] ExchangeServiceBinding, EWS, Exchange Web Service

查看:112
本文介绍了ExchangeServiceBinding,EWS,Exchange Web服务的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当前,我在尝试使用EWS时遇到问题,最初的要求是连接到特定用户的邮件,然后,搜索特定文件夹,搜索邮件,然后将附件下载到本地计算机上的特定文件夹,以便以后可以由Integration Services处理.我不想使用EWS托管API,因为我不想在迁移到生产服务器时安装任何东西,现在我的想法是开发一个WCF服务,该服务通过.asmx uri连接到EWS服务,并且能够满足我的要求,现在我可以连接到该公司的EWS,但是我有一些疑问:

Currently I'm facing a problem trying to use the EWS, the original requirement is to connect to the mail of a specific user, after that, search for a specific folder, search for a mail and then download the attachment to a specific folder to the local machine so that later it can be processed by Integration Services, I don't want to use the EWS Managed API because I don't want to install anything when migrating to the production server, right now my idea is to develop a WCF service that connects to the EWS service through the .asmx uri and that will be able to fulfill my requirement, right now I'm ok connecting to the company's EWS but I have a few doubts:

根据Microsoft: http://msdn.microsoft.com/zh-CN/library/exchange/bb408524(v=exchg.150).aspx 他们说您必须向项目添加Web服务引用,尽管它仅提及VS 2005和VS2008年(我正在使用VS 2012),它将自动创建类ExchangeServiceBinding,该类为您提供了模拟帐户所需的一切,我的第一个问题是:为什么我没有在我的项目中看到该类?我应该期望这是因为我正在使用VS 2012吗?

According to Microsoft: http://msdn.microsoft.com/en-us/library/exchange/bb408524(v=exchg.150).aspx they say you must add a web service reference to your project, although it only mentions VS 2005 and VS 2008 (I'm working with VS 2012), it should automatically creates the class ExchangeServiceBinding which gives you everything you need in order to impersonate an account, my first question is: why I'm not seeing this class added to my project? should I expect this is because I am using VS 2012?

好的,无论如何,我都可以使用诸如getPasswordExpirationTime之类的方法,但是当我使用FindFolder方法时,出现错误:该帐户无权模拟所请求的用户."方法:

ok, anyway I'm able to use some methods like getPasswordExpirationTime, but when I use the FindFolder method, I'm getting the error: "The account does not have permission to impersonate the requested user.", this is my method:

using (ExchangeServicePortTypeClient exchangeServicePortTypeClient = new ExchangeServicePortTypeClient())
                {
                    exchangeServicePortTypeClient.ChannelFactory.Endpoint.Address = new EndpointAddress("https://email.kraft.com/EWS/Exchange.asmx");


                    FindFolderResponseType findFolderResponseType = null;

                    exchangeServicePortTypeClient.FindFolder(
                        new ExchangeImpersonationType
                        {
                            ConnectingSID = new ConnectingSIDType
                            {
                                Item = @"gilberto.gutierrez@mdlz.com",
                                ItemElementName = ItemChoiceType1.PrimarySmtpAddress
                            }
                        },
                        null,
                        new RequestServerVersion { Version = ExchangeVersionType.Exchange2010_SP2 },
                        null,
                        new FindFolderType
                        {
                            FolderShape = new FolderResponseShapeType
                            {
                                BaseShape =
                                  DefaultShapeNamesType.Default
                            }
                        }, out findFolderResponseType);

                }                   

我试图通过此设置凭据:

I have tried to set the credentials through this:

exchangeServicePortTypeClient.ClientCredentials.Windows.ClientCredential.UserName
exchangeServicePortTypeClient.ClientCredentials.Windows.ClientCredential.Password      
exchangeServicePortTypeClient.ClientCredentials.Windows.ClientCredential.Domain             
exchangeServicePortTypeClient.ChannelFactory.Credentials.Windows.ClientCredential.UserName
exchangeServicePortTypeClient.ChannelFactory.Credentials.Windows.ClientCredential.Password
exchangeServicePortTypeClient.ChannelFactory.Credentials.Windows.ClientCredential.Domain

没有运气:(.

顺便说一句,这是我的wcf配置文件.

by the way, this is my wcf config file.

<?xml version="1.0" encoding="utf-8"?>

<configuration>

    <!--Diagnostics section, we will only catch error and warning in production-->

    <system.diagnostics>
        <sources>
            <source propagateActivity="true" name="System.ServiceModel" switchValue="Error, Warning">
                <listeners>
                    <add type="System.Diagnostics.DefaultTraceListener" name="Default">
                        <filter type="" />
                    </add>
                    <add type="System.Diagnostics.DefaultTraceListener" name="SellOut.ExchangeWcfService">
                        <filter type="" />
                    </add>
                    <add name="ServiceModelTraceListener">
                        <filter type="" />
                    </add>
                </listeners>
            </source>
            <source name="System.ServiceModel.MessageLogging" switchValue="Error, Warning">
                <listeners>
                    <add type="System.Diagnostics.DefaultTraceListener" name="Default">
                        <filter type="" />
                    </add>
                    <add type="System.Diagnostics.DefaultTraceListener" name="SellOut.ExchangeWcfService">
                        <filter type="" />
                    </add>
                    <add name="ServiceModelMessageLoggingListener">
                        <filter type="" />
                    </add>
                </listeners>
            </source>
        </sources>
        <sharedListeners>
            <add initializeData="C:\Users\LFH2623\Documents\SellOut\SellOut\SellOut.Hosts.ExchangeWcfService\SellOut.ExchangeWcfService_web_tracelog.svclog"
              type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
              name="ServiceModelTraceListener" traceOutputOptions="LogicalOperationStack, DateTime, Callstack">
                <filter type="" />
            </add>
            <add initializeData="C:\Users\LFH2623\Documents\SellOut\SellOut\SellOut.Hosts.ExchangeWcfService\SellOut.ExchangeWcfService_web_messages.svclog"
                type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
                name="ServiceModelMessageLoggingListener" traceOutputOptions="LogicalOperationStack, DateTime, Callstack">
                <filter type="" />
            </add>
        </sharedListeners>
        <trace autoflush="true" />
    </system.diagnostics>

    <!--Framework Section-->

    <appSettings>
        <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
    </appSettings>  

    <!--Web section-->

    <system.web>        
        <compilation debug="true" targetFramework="4.5" />
        <httpRuntime targetFramework="4.5" maxRequestLength="2147483646" />
    </system.web>

    <!--Web server section-->

    <system.webServer>
        <directoryBrowse enabled="false"/>
        <defaultDocument enabled="true"/>               
        <modules runAllManagedModulesForAllRequests="true"/>
    </system.webServer>

    <!--WS section-->

    <system.serviceModel>

        <diagnostics>
            <messageLogging logMalformedMessages="true"
                            maxMessagesToLog="10000"
                            logMessagesAtTransportLevel="true"
                            logMessagesAtServiceLevel="True"
                            logEntireMessage="true"/>
            <endToEndTracing activityTracing="false" />
        </diagnostics>

        <!--For the ExchangeWebService we will aply the following service and endpoint behaviors-->

        <behaviors>

            <serviceBehaviors>
                <behavior name="ExchangeWebService">
                    <serviceMetadata httpGetEnabled="true" httpsGetEnabled="false" />
                    <serviceDebug includeExceptionDetailInFaults="false" httpHelpPageEnabled="true" />
                    <dataContractSerializer maxItemsInObjectGraph="2147483646" />
                    <serviceTimeouts transactionTimeout="01:00:00" />
                    <serviceThrottling maxConcurrentCalls="100" maxConcurrentSessions="100" maxConcurrentInstances="100"/>
                    <serviceDiscovery>
                        <announcementEndpoints>
                            <endpoint kind="udpAnnouncementEndpoint"></endpoint>
                        </announcementEndpoints>
                    </serviceDiscovery>
                </behavior>             
            </serviceBehaviors>

            <!-- Define the corresponding scope for the clients to find the service through resolve message -->

            <endpointBehaviors>
                <behavior name="ExchangeWebService">
                    <endpointDiscovery enabled="true">
                        <scopes>
                            <add scope="http://SellOut.ExchangeWcfService/"/>
                        </scopes>
                    </endpointDiscovery>
                </behavior>
            </endpointBehaviors>

        </behaviors>

        <!-- In case you want to scale this service -->

        <standardEndpoints>

            <!-- We allow the service to be discoverable through the network in an adhoc architecture through UDP -->

            <udpDiscoveryEndpoint>
                <standardEndpoint name="adhocDiscoveryEndpointConfiguration"
                                  discoveryMode="Adhoc"
                                  discoveryVersion="WSDiscovery11"
                                  maxResponseDelay="00:00:10">
                </standardEndpoint>
            </udpDiscoveryEndpoint>

            <!-- We allow the service to be discoverable through the network in a managed architecture -->

            <discoveryEndpoint>
                <standardEndpoint name="managedDiscoveryEndpoint" discoveryMode="Managed" maxResponseDelay="00:01:00"/>
            </discoveryEndpoint>

            <!-- We announce the service with hello & bye -->

            <announcementEndpoint>
                <standardEndpoint name="udpAnnouncementEndpointConfiguration"
                                  discoveryVersion="WSDiscovery11" />
            </announcementEndpoint>

        </standardEndpoints>

        <!--All the Kraft's clients are .net, so we will use the proprietary binary message encoding to reduce the message's size -->

        <bindings>
            <customBinding>
                <binding name="wsHttpBindingBynaryEncoding"
                         closeTimeout="00:10:00"
                         openTimeout="00:10:00"
                         receiveTimeout="00:10:00"
                         sendTimeout="00:10:00">
                    <binaryMessageEncoding>
                        <readerQuotas maxDepth="32"
                                      maxStringContentLength="5242880"
                                      maxArrayLength="2147483646"
                                      maxBytesPerRead="4096"
                                      maxNameTableCharCount="5242880" />
                    </binaryMessageEncoding>
                    <httpTransport
                                    transferMode="Buffered"
                                    maxBufferPoolSize="2147483646"
                                    maxReceivedMessageSize="2147483646">
                    </httpTransport>
                </binding>
            </customBinding>

            <basicHttpBinding>
                <binding name="KraftEWS" messageEncoding="Text" transferMode="Buffered">
                    <security mode="Transport">
                        <transport clientCredentialType="Windows" proxyCredentialType="Windows"></transport>                        
                    </security>             
                </binding>
            </basicHttpBinding>

        </bindings>

        <!-- We reference the Kraft EWS -->

        <client>
            <endpoint binding="basicHttpBinding" bindingConfiguration="KraftEWS"
                      contract="KraftEWS.ExchangeServicePortType"                                     
                      name="ExchangeServiceBinding_ExchangeServicePortType">                
            </endpoint>
        </client>

        <!--Services section-->

        <services>
            <service name="SellOut.Services.Exchange.ExchangeWebService" behaviorConfiguration="ExchangeWebService">
                <endpoint name="rules"
                          address="rules"
                          binding="customBinding"
                          bindingConfiguration="wsHttpBindingBynaryEncoding"
                          behaviorConfiguration="ExchangeWebService"
                          contract="SellOut.Contracts.Exchange.IExchangeRulesContract"/>
                <endpoint name="udpDiscovery"
                          kind="udpDiscoveryEndpoint"
                          endpointConfiguration="adhocDiscoveryEndpointConfiguration" />
                <endpoint name="mex"
                          address="mex"
                          binding="mexHttpBinding"
                          contract="IMetadataExchange" />               
            </service>
        </services>

        <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />

    </system.serviceModel>

</configuration>

在此配置中要提及的另一件事:

another thing to mention, in this config:

<basicHttpBinding>
                    <binding name="KraftEWS" messageEncoding="Text" transferMode="Buffered">
                        <security mode="Transport">
                            <transport clientCredentialType="Windows" proxyCredentialType="Windows"></transport>                        
                        </security>             
                    </binding>
                </basicHttpBinding>

如果我删除了部分客户端凭据类型"Windows",则在尝试运行服务时会出现以下异常:

if I remove the part client credential type "Windows", when trying to run the service the exception is :

HTTP请求未经客户端身份验证方案匿名"授权.从服务器收到的身份验证标头是"Negotiate,NTLM".

The HTTP request is unauthorized with client authentication scheme 'Anonymous'. The authentication header received from the server was 'Negotiate,NTLM'.

你们能帮我吗?

感谢您的咨询.

推荐答案

我强烈建议您为此使用EWS托管API.当您声明不想在生产服务器上安装任何内容时,我不明白您的意思,因为您将不得不在生产服务器上安装WCF服务以及由添加Web服务"参考创建的对象模型.项目.但是,看来您已经通过了这一部分,所以让我们继续....

I highly suggest that you use the EWS Managed API for this. I don't understand what you mean when you state that you don't want to install anything on the production server since you will have to install the WCF service on your production server, along with the object model created by the Add Web Service reference project. But, it looks like you got passed this part, so let's move on....

非常好,很高兴您可以调用getPassowrdExpirationTime.感谢您向我提供该信息.

Excellent, good to know that you could call getPassowrdExpirationTime. Thank you for providing me that info.

之所以收到消息该帐户无权模拟所请求的用户"的原因,是因为运行WCF服务的帐户没有对该邮箱的模拟权限.您将需要设置Exchange模拟功能您的服务帐户可以访问该用户的帐户之前.一旦您的服务具有Exchange可以在AD中查找的凭据(它已经完成),并且它有权模拟您的用户(位于TODO列表中),您的代码就应该可以正常工作,因为身份验证是基于服务帐户的身份完成的.

The reason why you get the message "The account does not have permission to impersonate the requested user" is because the account that runs your WCF service doesn't have impersonation rights to the mailbox. You will need to setup Exchange impersonation before your service account can access the user's account. Once your service has credentials that Exchange can lookup in AD (which it already does), and it has rights to impersonate your users (which is on your TODO list), your code should work since authentication is done based on the service account's identity.

代码示例后的问题的所有部分均不在范围内.您不需要对web.config进行任何更改(至少我不这么认为).我假设您正在针对本地服务器进行测试,因为Auth方案是Negotiate和NTLM.

All parts of your question after your code example are not in scope. You don't need to make any changes to the web.config (at least I don't think so). I assume that you are testing against an on-premise server since the Auth schemes were Negotiate and NTLM.

关于

您链接到的文章

这篇关于ExchangeServiceBinding,EWS,Exchange Web服务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆