繁体   English   中英

对于C#.net 2.0 WebService,使用复杂类型编码输入参数的正确方法是什么?

[英]What is right way to code input parameters with complex types for a C# .net 2.0 WebService?

我目前正在构建公司已提供的Web服务的新版本。 当前的Web服务的输入参数为字符串类型。 在该字符串中,将传递整个xml文档。 然后,我们针对xsd(与提供给使用者的xsd相同)验证该字符串。 看起来像这样:

[WebMethod]
public bool Upload(string xml)
{
    if (ValidateXML(xml))
    {
        //Do something
    }
}

我正在构建此服务的下一个版本。 我给人的印象是,将XML文档作为字符串传递不是正确的方法。 我当时在想我的服务看起来像这样:

[WebMethod]
public bool Upload(int referenceID, string referenceName, //etc...)
{
    //Do something
}

我遇到的这个问题是,实际上有大量的输入参数,其中一些是复杂类型。 例如,上载方法需要采用一个称为分配的复杂对象。 该对象实际上由几个整数,十进制值,字符串和其他复杂对象组成。 我是否应该像这样构建Web服务:

[WebMethod]
public bool Upload(int referenceID, string referenceName, Allocation referenceAllocation)
{
    //Do something
}

还是有其他方法可以做到这一点?

注意:此分配对象在xsd中具有为旧服务提供的层次结构。

可能是原始服务仅采用xml来解决此问题吗? 是否有更好的方法将复杂类型带入Web服务?

注意:这是C#2.0 Web服务。

我可能会使用带有“ xsd.exe”工具的XSD来创建XML Serializable对象。 然后,您可以处理对象而不是字符串参数。 它还使您能够不更改WebService的签名。

如果将XSD更改为添加另一个参数,则只需使用XSD.exe工具重新创建该类即可。 在这里充分利用局部类 将自动生成的类与业务逻辑分开。 这样,如果XSD可以根据需要进行多次更改,则可以重新创建类定义,但不要触碰您的业务逻辑。

.NET Framework中的XML序列化

如果使用的是3.5,则还可以使用LINQ to XML快速解析出XML参数。

乔恩,首先回答您的后续问题:如果您的客户端位于多个平台上(或至少不是全部位于.NET上),那么最好的方法是所谓的“ WSDL-first”。 在WSDL中定义服务接口-将在其中定义服务和方法-WSDL将引用一组XSD,这些XSD定义了传递给这些方法和从这些方法返回的数据保存对象。 您可以从WSDL / XSD生成C#或Java代码。

回到您的原始问题。 为了实现相同的可维护性,最佳实践是为每个Web方法定义Request和Response类,并且切勿直接传递字符串,布尔值,整数。 例如,

// in your Web service class
[WebMethod]
public UploadResponse Upload( UploadRequest request ) {
    ...
}
...

[Serializable]
public class UploadResponse {
  public bool IsSuccessful {
    get { ... }
    set { ... }
  }
}

[Serializable]
public class UploadRequest {
  public Allocation ReferenceAllocation {
    get { ... }
    set { ... }
  }
  // define other request properties
  // ...
}

如果您在WSDL文件中定义了SOAP绑定,则会从SOAP消息中提取UploadRequest对象并反序列化。 控件到达WebMethod实现时,您在内存中已反序列化了UploadRequest对象,并设置了其所有属性。

要拥有这样的方法:[WebService]类中的public bool Upload(string xml)并在方法实现内部解析XML绝对是您应该考虑的方法。

只要您的复杂类型可以通过XmlSerializable进行,那么使用这些复杂类型就不会有任何问题。 让框架为您完成繁重的工作。 它将生成一个适当的WSDL,并且数据将全部由自身序列化,而您不必担心验证和序列化。

[可序列化]是您的朋友。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM