我可以创建具有属性的Web服务吗?

时间:2009-07-10 17:01:17

标签: c# web-services properties asmx

我正在尝试围绕尚未提供的Web服务测试代码。我正在试图假装自己的版本。根据规格,它将被称为这样。

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正确生成Web引用?

这是我目前的虚拟网络服务代码。

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 个答案:

答案 0 :(得分:3)

您的设计存在缺陷。 Web服务并不意味着具有属性。它们应该只暴露方法,原因是HTTP协议是无状态的(并且Web服务也假设这一点),因此暴露属性没有意义,除非您希望它应用于实例的所有调用者(甚至,甚至在那种情况下,揭露它是没有意义的。)

相反,您要做的是让DoMyThing方法获取ServiceData的实例(如果需要)并对其进行操作,返回相应的结果集。

如果您确实需要公开服务的属性,那么您将拥有一个不带参数的GetProperties方法(或类似的方法)并返回包含服务信息的相应数据结构。

答案 1 :(得分:1)

我正在使用casperOne。我认为使用fakie属性比使用更烦人。

尽管如此,如果你嫁给了这只是消除了财产的吸气剂。你不需要它。这样做:

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

如果Visual Studio仍然错误地命名setter属性,则可以使用其中一个soap属性重命名它。

编辑:您还需要将SD定义为SOAP标头。

答案 2 :(得分:1)

你不能这样做,所以不要试图“假装”。你能做的最好的是:

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

答案 3 :(得分:0)

对于那些可能感兴趣的人。 这比我上面的清理版更准确地反映了规范(我不知道“TypeNameValue”是一个关键线索,对不起!)。

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

这是可行的虚拟Web服务代码。

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; }
}