Могу ли я создать веб-сервис со свойствами? - PullRequest
1 голос
/ 10 июля 2009

Я пытаюсь протестировать код вокруг веб-службы, которая еще не доступна. Я пытаюсь придумать свою собственную версию. Согласно спецификации это будет называться так.

var service = new Service();
service.SD = new ServiceData();
service.SD.ID = "ABC123";
service.SD.Auth = "00000";
string result = service.DoMyThing();

Это самое близкое, что я получил.

var service = new Service();
service.set_SD(new ServiceData());
service.get_SD().ID = "ABC123";
service.get_SD().Auth = "00000";
service.DoMyThing();

Проблема со свойством SD. Как мне написать сервис, чтобы Visual Studio 2008 правильно генерировал веб-ссылку?

Вот мой текущий фиктивный код веб-службы.

public class Service : System.Web.Services.WebService
{
    // This doesn't show up in the generated proxy at all
    public static ServiceData SDTest;

    // For extra credit explain why this needs to be static for it to work
    private static ServiceData _sd;
    public ServiceData SD
    {
        [WebMethod(EnableSession = true)]
        get { return _sd; }
        [WebMethod(EnableSession = true)]
        set { _sd = value; }
    }

    [WebMethod]
    public string DoMyThing()
    {
        // Presumably the real service accesses SD in here
        return "";
    }
}

public class ServiceData
{
    public string ID { get; set; }
    public string Auth { get; set; }
}

Ответы [ 4 ]

3 голосов
/ 10 июля 2009

Ваш дизайн несовершенен. Веб-сервисы не должны иметь свойства. Они должны предоставлять только методы, причина в том, что протокол HTTP не имеет состояния (и веб-сервисы тоже это допускают), поэтому предоставление свойства не имеет смысла, если вы не хотите, чтобы оно применялось ко всем вызывающим объектам экземпляра (и тем не менее в такой ситуации разоблачать не имеет смысла).

Скорее, вы хотите, чтобы метод DoMyThing взял экземпляр ServiceData (если требуется) и работал с ним, возвращая соответствующий набор результатов.

Если вам действительно необходимо предоставить свойства службы, у вас будет метод GetProperties (или что-то подобное), который не принимает параметров и возвращает соответствующую структуру данных с информацией о службе.

1 голос
/ 10 июля 2009

Вы не можете этого сделать, поэтому не пытайтесь "подделать это". Лучшее, что вы можете сделать, это:

var service = new Service();
ServiceData sd = new ServiceData();
sd.ID = "ABC123";
sd.Auth = "00000";
string result = service.DoMyThing(sd);
1 голос
/ 10 июля 2009

Я с CasperOne на этом. Я думаю, что использование поддельных свойств скорее раздражает, чем полезно.

Тем не менее, если вы женаты на этом, просто уберите добытчика за собственность. Тебе это не нужно. Сделайте это вместо:

var service = new Service();
ServiceData sd = new ServiceData();
sd.ID = "ABC123";
sd.Auth = "00000";
service.SD = sd;
string result = service.DoMyThing();

Если Visual Studio по-прежнему неправильно называет свойство сеттера, вы можете использовать один из атрибутов мыла для его переименования.

РЕДАКТИРОВАТЬ: Вам также необходимо определить SD как заголовок SOAP.

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

Для тех, кто может быть заинтересован. Это более точно отражает спецификацию, чем моя дезинфицированная версия выше (я не знал, что «TypeNameValue» была ключевой подсказкой, извините!).

var service = new Service();
service.ServiceDetailsValue = new ServiceDetails();
service.ServiceDetailsValue.ID = "ABC123";
service.ServiceDetailsValue.Auth = "00000";
string result = service.DoMyThing();

И это фиктивный код веб-службы, который работает.

using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(Name="TestService", ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service : System.Web.Services.WebService
{
    public ServiceDetails SDTest;

    [WebMethod]
    [SoapDocumentMethod(Binding = "TestService")]
    [SoapHeader("SDTest", Required = true)]
    public string DoMyThing()
    {
        return "";
    }
}

public class ServiceDetails : System.Web.Services.Protocols.SoapHeader
{
    public string ID { get; set; }
    public string Auth { get; set; }
}
...