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

C# 我可以创建具有属性的Web服务吗?,c#,web-services,properties,asmx,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

我正试图围绕一个还不可用的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属性。如何编写服务以使VisualStudio2008正确生成web引用

这是我当前的虚拟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; }
}

你的设计有缺陷。Web服务并不意味着具有属性。它们应该只公开方法,原因是HTTP协议是无状态的(web服务也假定这一点),因此公开属性没有意义,除非您希望它应用于实例的所有调用方(即使在这种情况下,公开属性也没有意义)

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


如果您确实需要公开服务的属性,那么可以使用GetProperties方法(或类似方法),该方法不接受任何参数,并返回包含服务信息的适当数据结构。

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

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


如果您确实需要公开服务的属性,您可以使用一个GetProperties方法(或类似的方法),该方法不接受任何参数,并返回包含服务信息的适当数据结构。

我支持casperOne。我认为使用伪造的属性更烦人,而不是有用

尽管如此,如果你嫁给了这个,那就排除掉这个财产的获取者。你不需要它。改为这样做:

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头。

我同意casperOne的观点。我认为使用伪造的属性更烦人,而不是有用

尽管如此,如果你嫁给了这个,那就排除掉这个财产的获取者。你不需要它。改为这样做:

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头。

您不能这样做,所以不要试图“伪造它”。您所能做的就是:

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

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

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

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

这是工作的虚拟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; }
}

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

这是工作的虚拟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; }
}

那不行。不能有SD属性。将“sd”作为方法参数传递。不,我很确定它在.Net中有效。它作为一个自定义SOAP头发送。请参阅:仅当存在自定义SOAP头时,它才起作用。它必须由WSDL声明。谢谢大家,代码项目链接有详细信息。规范中的实际属性带有“Value”后缀,用于密封交易。这不起作用。不能有SD属性。将“sd”作为方法参数传递。不,我很确定它在.Net中有效。它作为一个自定义SOAP头发送。请参阅:仅当存在自定义SOAP头时,它才起作用。它必须由WSDL声明。谢谢大家,代码项目链接有详细信息。规范中的实际属性具有“Value”后缀,用于密封交易。请注意,服务没有属性。代理类分配了另一个类(ServiceDetails)的实例,该实例正在web服务调用之前填写。调用时,该实例被序列化为SOAP消息的源。该服务将能够将其作为公共字段读取。请注意,该服务没有属性。代理类分配了另一个类(ServiceDetails)的实例,该实例正在web服务调用之前填写。调用时,该实例被序列化为SOAP消息的源。服务将能够将其作为公共字段读取。