Вызов веб-служб из приемника событий

Я использую C # для создания приемника событий для мониторинга определенного почтового ящика сервера обмена. Моя реализация основана на следующем примере: http://www.codeproject.com/KB/exchange/ManagedEventSinks.aspx?fid=382114&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=26#xx0xx

Вместо функциональности, описанной в примере, я пытаюсь отправить некоторую конкретную информацию в веб-службу. Я использую Visual Studio, чтобы добавить ссылку на службу в мою библиотеку классов и следующий код для вызова единственного метода в веб-службе:

public void OnSave(IExStoreEventInfo pEventInfo, string bstrURLItem, int lFlags)
{
    try
    {
        Message iMessage = new MessageClass();
        iMessage.DataSource.Open(bstrURLItem, null,
               ADODB.ConnectModeEnum.adModeRead,
               ADODB.RecordCreateOptionsEnum.adFailIfNotExists,
               ADODB.RecordOpenOptionsEnum.adOpenSource, "", "");

        string sub= iMessage.Subject;

        string body = iMessage.HTMLBody;

        MyWSSoapClient wsc = new MyWSSoapClient();
        wsc.SingleMethodinWS(sub, body); 
    }
    catch (Exception ex)
    {
    }
}

После того, как я создаю компонент COM, добавляю приемник событий во входящие и проверяю его, я получаю сообщение об ошибке:

Could not find default endpoint element that references contract 'MyWS.MyWSSoap' in the ServiceModel client configuration section. This might be because no configuration file was found for your application, or because no endpoint element matching this contract could be found in the client element.
   at System.ServiceModel.Description.ConfigLoader.LoadChannelBehaviors(ServiceEndpoint serviceEndpoint, String configurationName)
   at System.ServiceModel.ChannelFactory.ApplyConfiguration(String configurationName)
   at System.ServiceModel.ChannelFactory.InitializeEndpoint(String configurationName, EndpointAddress address)
   at System.ServiceModel.ChannelFactory`1..ctor(String endpointConfigurationName, EndpointAddress remoteAddress)
   at System.ServiceModel.EndpointTrait`1.CreateSimplexFactory()
   at System.ServiceModel.EndpointTrait`1.CreateChannelFactory()
   at System.ServiceModel.ClientBase`1.CreateChannelFactoryRef(EndpointTrait`1 endpointTrait)
   at System.ServiceModel.ClientBase`1.InitializeChannelFactoryRef()
   at System.ServiceModel.ClientBase`1..ctor()
   at ReplyParserEventSink.AnswerQuestionWS.AnswerQuestionWSSoapClient..ctor()
   at ReplyParserEventSink.AsyncParser.OnSave(IExStoreEventInfo pEventInfo, String bstrURLItem, Int32 lFlags)

РЕДАКТИРОВАТЬ: это то, что я нашел в конфигурации приложения

<system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="MyWSSoap" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
<endpoint address="http://127.0.0.1/MyProject/WebService/MyWS.asmx"
                binding="basicHttpBinding" bindingConfiguration="MyWSSoap"
                contract="MyWS.MyWSSoap" name="MyWSSoap" />
</system.serviceModel>

@Alexander: Я пробовал то, что вы сказали, но получаю ту же ошибку. Спасибо


person Constantin    schedule 21.02.2011    source источник


Ответы (2)


Это конечно VS2010. Дело в автогенерированном коде в app.config.

Проверьте свой app.config. Этот файл содержит все определения привязок и конечных точек. Просто проверьте свои конечные точки 1st, проверьте, описана ли ваша конечная точка и определена ли привязка.

После этого попробуйте:

MyWSSoapClient wsc = new MyWSSoapClient( "<endpointConfigurationName>" );

и посмотрим, что будет.

Также в области <client> вы найдете описание конечных точек. Попробуй вручную поменять привязку к basicHttpBinding - у меня это сработало.

    <endpoint address="http://service.address.com"
        binding="basicHttpBinding" bindingConfiguration="yourService"
        contract="Domain.Serice" name="serviceName" />
person Alexander Sobolev    schedule 21.02.2011

Я отвечаю на свой вопрос, потому что нашел и устранил проблему

Проблема заключалась в том, что информация из файла app.config библиотеки классов не попадала в компонент com и, следовательно, вызывала ошибку.

Я исправил это, установив все свои значения параметров в моем коде из внешнего текстового файла, следуя примеру на: Использовать веб-службу SOAP, не полагаясь на app.config

Спасибо за предложения всем.

person Constantin    schedule 21.02.2011