我正在尝试围绕尚未提供的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; }
}
答案 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; }
}