Как получить доступ к веб-сервису с перегруженными методами - PullRequest
15 голосов
/ 21 июля 2009

Я пытаюсь использовать перегруженные методы в веб-службе, но получаю исключение System.InvalidOperationException при попытке добавить веб-ссылку в Visual Studio 2005 (вот соответствующие фрагменты кода):

public class FileService : System.Web.Services.WebService
{
    private static readonly MetaData[] EmptyMetaData = new MetaData[0];
    public FileService()
    {
    // a few innocent lines of constructor code here...
    }
    [WebMethod(MessageName = "UploadFileBasic", 
        Description = "Upload a file with no metadata properties")]
    public string UploadFile(string trimURL
        , byte[] incomingArray
        , string fileName
        , string TrimRecordTypeName)
    {
        return UploadFile(trimURL
                , incomingArray
                , fileName
                , TrimRecordTypeName
                , EmptyMetaData);
    }
    [WebMethod(MessageName = "UploadFile",
        Description = "Upload a file with an array of metadata properties (Name/Value pairs)")]
    public string UploadFile( string trimURL
        , byte[] incomingArray
        , string FileName
        , string TrimRecordTypeName
        , MetaData[] metaDataArray)
    {
    // body of UploadFile function here 

Я думал, что предоставление другого свойства MessageName для атрибута WebMethod решит эту проблему, но вот полное сообщение об ошибке, которое я получаю:

Как System.String UploadFileBasic (System.String, Byte [], System.String, System.String), так и System.String UploadFile (System.String, Byte [], System.String, System.String) используют сообщение имя «UploadFileBasic». Используйте свойство MessageName пользовательского атрибута WebMethod, чтобы указать уникальные имена сообщений для методов.

Веб-сервис компилируется нормально; Я не вижу, что здесь не так.

Ответы [ 4 ]

14 голосов
/ 21 июля 2009

Я предлагаю не использовать перегруженные имена методов. В WSDL такого понятия нет, так зачем?

6 голосов
/ 02 января 2013

Вам необходимо изменить эту часть:

[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

к этому:

[WebServiceBinding(ConformsTo = WsiProfiles.None)]
0 голосов
/ 30 марта 2018

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

Сначала нужно поменять

[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

К

[WebServiceBinding(ConformsTo = WsiProfiles.None)]

Во-вторых, свойство MessageName для WebMethod должно быть другим для перегруженного метода.

namespace foo
{
    /// <summary>
    /// Summary description for TestService
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.None)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService]
    public class TestService : System.Web.Services.WebService
    {

        [WebMethod(MessageName = "HelloWorld1")]
        public string HelloWorld()
        {
            return "Hello World";
        }

        [WebMethod(MessageName = "HelloWorld2")]
        public string HelloWorld(string Value = "default")
        {
            return "Hello World";
        }
    }
}

Но если вы позвоните по URL, например:

http://localhost:15558/TestService.asmx/HelloWorld2?Value=2

Это будет работать.

Но если вы позвоните по URL, например:

http://localhost:15558/TestService.asmx/HelloWorld?Value=2

Будет отображаться HTTP 500

0 голосов
/ 21 июля 2009

Я бы обычно имел объект класса за интерфейсом веб-службы, который имеет перегруженные методы, а затем создавал бы отдельные методы в вашем файле asmx.cs с разными именами. Я знаю, что вы можете использовать атрибуты, но это делает код более аккуратным ИМХО.

...