Ошибка: не удалось найти элемент конечной точки по умолчанию, который ссылается на контракт.

Я пишу приведенный ниже код для создания компонента MM в tridion через основную службу, но я получаю сообщение об ошибке при запуске этой службы,

 public ComponentData GetNewMultimediaComponent(CoreServiceClient Client, string folderUri, string schemaUri, string title, FileInfo fi)
    {
        if (fi.Extension == ".png")
        {
            string mmType = GetMultiMediaType(fi.Extension);
            if (mmType != null)
            {
                string tempLocation = "";

                UploadResponse us = new UploadResponse();
                using (StreamUploadClient streamClient = GetConnection())
                {
                    FileStream objfilestream = new FileStream(fi.FullName, FileMode.Open, FileAccess.Read);
                    tempLocation = streamClient.UploadBinaryContent(fi.Name.ToLower(), objfilestream);
                }

                BinaryContentData bcd = new BinaryContentData
                {
                    UploadFromFile = fi.FullName,
                    MultimediaType = new LinkToMultimediaTypeData { IdRef = mmType },
                    Filename = fi.Name,
                    IsExternal = false
                };

                ComponentData res = GetNewComponent(folderUri, schemaUri, title);
                res.ComponentType = ComponentType.Multimedia;
                res.BinaryContent = bcd;

                res = (ComponentData)Client.Create(res, new ReadOptions());

В приведенном выше коде я получаю ошибку в строке ниже

using (StreamUploadClient streamClient = new StreamUploadClient()) 



{System.InvalidOperationException: Could not find default endpoint element that references contract 'Tridion.ContentManager.CoreService.Client.IStreamUpload' 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, Configuration configuration)
       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.ClientBase`1.CreateChannelFactoryRef(EndpointTrait`1 endpointTrait).......

Просто для обновления я использую основные службы tridion с помощью DLL без файла конфигурации и успешно создаю соединение.

Настройка подключения

public StreamUploadClient GetConnection()
    {
        BasicHttpBinding basicHttpBinding = new BasicHttpBinding
        {
            MaxReceivedMessageSize = 10485760,
            ReaderQuotas = new XmlDictionaryReaderQuotas
            {
                MaxStringContentLength = 10485760,
                MaxArrayLength = 10485760
            },
            Security = new BasicHttpSecurity
            {
                Mode = BasicHttpSecurityMode.None,
            }
        };

        EndpointAddress remoteAddress = new EndpointAddress("http://abc/webservices/CoreService2011.svc/streamUpload_basicHttp");

        StreamUploadClient client = new StreamUploadClient(basicHttpBinding, remoteAddress);
        try
        {
            client.Open();
        }
        catch (Exception ex)
        {
           //log.Error("Error:CoreServiceConectionOpen:Common:" + ex.Message);
            throw ex;
        }

        return client;
    }

Теперь получаю ошибку в строке ниже

tempLocation = streamClient.UploadBinaryContent(fi.Name.ToLower(), objfilestream);

{System.ServiceModel.ProtocolException: The content type multipart/related; type="application/xop+xml";start="<http://tempuri.org/0>";boundary="uuid:739a821f-aee2-4eaf-9206-05a1ed19311c+id=1";start-info="text/xml" of the response message does not match the content type of the binding (text/xml; charset=utf-8). If using a custom encoder, be sure that the IsContentTypeSupported method is implemented properly. The first 560 bytes of the response were: '
--uuid:739a821f-aee2-4eaf-9206-05a1ed19311c+id=1
Content-ID: <http://tempuri.org/0>
Content-Transfer-Encoding: 8bit
Content-Type: application/xop+xml;charset=utf-8;type="text/xml"

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Header><h:FilePath xmlns:h="http://www.sdltridion.com/ContentManager/CoreService/2011">C:\Windows\TEMP\tmp6841.png</h:FilePath></s:Header><s:Body><UploadResponse xmlns="http://www.sdltridion.com/ContentManager/CoreService/2011"/></s:Body></s:Envelope>
--uuid:739a821f-aee2-4eaf-9206-05a1ed19311c+id=1--
'.

Может ли кто-нибудь помочь мне решить эту проблему?


person Priyank Gupta    schedule 07.02.2013    source источник


Ответы (1)


Проблема именно в этой строке:

StreamUploadClient streamClient = new StreamUploadClient()

Это отдельная конечная точка, к которой вы пытаетесь подключиться. Обычно он выбирает адрес и все другие свойства соединения из app.config, но, поскольку у вас их нет, вам нужно самостоятельно указать все необходимые параметры, аналогично тому, что вы делаете с вашим CoreService. Обратитесь к образцу app.config, чтобы узнать, какие параметры вам нужны.

Что-то вроде этого:

    public StreamUploadClient GetConnection()
    {
        BasicHttpBinding basicHttpBinding = new BasicHttpBinding
        {
            MaxReceivedMessageSize = 10485760,
            ReaderQuotas = new XmlDictionaryReaderQuotas
            {
                MaxStringContentLength = 10485760,
                MaxArrayLength = 10485760
            },
            MessageEncoding = WSMessageEncoding.Mtom,
            Security = new BasicHttpSecurity
            {
                Mode = BasicHttpSecurityMode.None,
            }
        };

        EndpointAddress remoteAddress = new EndpointAddress("http://abc/webservices/CoreService2011.svc/streamUpload_basicHttp");

        StreamUploadClient client = new StreamUploadClient (basicHttpBinding, remoteAddress);
        try
        {
            client.Open();
        }
        catch (Exception ex)
        {
            log.Error("Error:CoreServiceConectionOpen:Common:" + ex.Message);
            throw ex;
        }

        return client;
    }
person Andrey Marchuk    schedule 07.02.2013
comment
Я не использую файл app.config, что мне теперь делать? Как вы можете заметить, я передаю свой клиентский объект, который имеет все детали подключения. - person Priyank Gupta; 07.02.2013
comment
Я понимаю вашу точку зрения, но когда я иду таким образом, ошибка становится ниже в строке выше tempLocation = streamClient.UploadBinaryContent(fi.Name.ToLower(), objfilestream); Ошибка: я понимаю вашу точку зрения, но когда я иду таким образом, ошибка становится ниже в строке выше {System.ServiceModel.ProtocolException: тип содержимого multipart/related; type=application/xop+xml;start=‹tempuri.org/ ответного сообщения не соответствует типу содержимого привязки (text/xml... - person Priyank Gupta; 07.02.2013
comment
Исправлено, MessageEncoding = WSMessageEncoding.Mtom отсутствовал, см. обновленный пример - person Andrey Marchuk; 07.02.2013