C# 我可以创建具有属性的Web服务吗?
我正试图围绕一个还不可用的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
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消息的源。服务将能够将其作为公共字段读取。