Ссылка службы WCF генерирует недействительные методы из WSDL

Это моя первая попытка использовать WCF, поэтому я предполагаю, что я делаю что-то неправильное. Я пытаюсь получить доступ к сервису мыла, определенному WSDL, в http://confluence.atlassian.com/rpc/soap-axis/confluenceservice-v1?wsdl Я использую VS2010, и я добавляю ссылку на службу на мой и укажите его на URL-адрес (точнее, инсталляцию этой интрасети), но когда я использую Обозреватель объектов для просмотра службы, операции на интерфейсе - это ВСЕ-пустовые методы без параметров. Похоже, что WCF неправильно считывает информацию о типе. Он не дает ошибок, но дает тонны предупреждений, например:

Предупреждение 1 Предупреждение о настраиваемом инструменте: ошибка с именем InvalidSessionException в операции getPermissions не могут быть импортирован. Неподдерживаемый WSDL, ошибка сообщение должно ссылаться на элемент. Это сообщение об ошибке не ссылку на элемент. Если вы редактируете доступ к документу WSDL, вы можете устранить проблему, ссылаясь на элемент схемы, используя элемент 'element' атрибут. Z:\TestLibrary\Service Ссылки \Confluence\Reference.svcmap 1 1 TestLibrary

Предупреждение 2 Предупреждение о настраиваемом инструменте: необязательный элемент расширения WSDL 'body' из пространства имен 'http://schemas.xmlsoap.org/wsdl/soap/' не было обработано. XPath: //wsdl: определения [@targetNamespace = 'http://confluence.atlassian.com/rpc/soap-axis/confluenceservice-v1']/wsdl: binding [@ name= 'confluenceservice-v1SoapBinding']/wsdl: операция [@name= 'getPermissions']/wsdl: input [@name= 'getPermissionsRequest'] Z:\TestLibrary\Service Ссылки \Confluence\Reference.svcmap 1 1 TestLibrary

Что я делаю неправильно? Я попытался изменить конфигурацию службы с помощью комбинаций параметров, но я никогда не смог бы правильно использовать типы из WSDL. Я предполагал, что WCF будет автоматически генерировать классы типов вместе с интерфейсом службы. Должен ли я определять, какие типы используются в WSDL, и сами создавать контракты классов и данных, или это что-то еще?

Ответ 1

Hhmm... interesting - я побежал svcutil.exe из командной строки против указанного вами URL-адреса, и пока я получаю массу предупреждений о проблемах WSDL, я также получаю код - что-то вроде:

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:2.0.50727.4952
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(Namespace="http://confluence.atlassian.com/rpc/soap-axis/confluenceservice-v1", ConfigurationName="ConfluenceSoapService")]
public interface ConfluenceSoapService
{
    // CODEGEN: Generating message contract since the wrapper namespace (http://soap.rpc.confluence.atlassian.com) of message getPermissionsRequest does not match the default value (http://confluence.atlassian.com/rpc/soap-axis/confluenceservice-v1)
    [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
    [System.ServiceModel.XmlSerializerFormatAttribute(Style=System.ServiceModel.OperationFormatStyle.Rpc, Use=System.ServiceModel.OperationFormatUse.Encoded)]
    getPermissionsResponse getPermissions(getPermissionsRequest request);

    // CODEGEN: Generating message contract since the wrapper namespace (http://soap.rpc.confluence.atlassian.com) of message searchRequest does not match the default value (http://confluence.atlassian.com/rpc/soap-axis/confluenceservice-v1)
    [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
    [System.ServiceModel.XmlSerializerFormatAttribute(Style=System.ServiceModel.OperationFormatStyle.Rpc, Use=System.ServiceModel.OperationFormatUse.Encoded)]
    [System.ServiceModel.ServiceKnownTypeAttribute(typeof(RemoteException))]
    [System.ServiceModel.ServiceKnownTypeAttribute(typeof(Vector))]
    [System.ServiceModel.ServiceKnownTypeAttribute(typeof(RemotePermission))]
    [System.ServiceModel.ServiceKnownTypeAttribute(typeof(RemoteNodeStatus))]
    [System.ServiceModel.ServiceKnownTypeAttribute(typeof(RemotePageHistory))]
    [System.ServiceModel.ServiceKnownTypeAttribute(typeof(RemoteContentPermission))]
    [System.ServiceModel.ServiceKnownTypeAttribute(typeof(AbstractRemotePageSummary))]
    [System.ServiceModel.ServiceKnownTypeAttribute(typeof(RemoteSpaceSummary))]
    [System.ServiceModel.ServiceKnownTypeAttribute(typeof(RemoteSearchResult))]
    searchResponse search(searchRequest request);

Поэтому я попытался использовать svcutil.exe из командной строки, чтобы сгенерировать ваш файл ConfluenceSoapService.cs, а затем использовать его, чтобы поговорить с вашей службой Confluence.

Ответ 2

Только что столкнулась с этой проблемой в JIRA 4.4, и она работает, если вы используете более старую веб-ссылку вместо Service Reference.

Инструкции по выполнению этого действия см. в разделе Ссылка на веб-ссылку и сервис

Это было самое простое решение для меня, так как я знаю, что JIRA движется к REST (далеко от SOAP), и я просто пытаюсь быстро встать и работать.