【发布时间】:2019-12-10 10:43:10
【问题描述】:
我有一个对象应该用这些值来描述一些客户:
{
public class CustomerDescription
{
public string FirstName { get; set; } = "";
public string LastName { get; set; } = "";
public string StreetName { get; set; } = "";
public string HouseNumber { get; set; } = "";
public string PostalPlace { get; set; } = "";
public string PostCode { get; set; } = "";
public string CountryCode { get; set; } = "";
public string EMail { get; set; } = "";
public string PhoneNumber { get; set; } = "";
}
}
这些值是从客户数据库中检索出来的,并将用于创建一个 XML 文件,该文件将通过 SOAP 发送到另一个数据库。但是,并非所有这些值都始终存在。例如,一位客户可能在数据库中没有国家代码。在这种情况下,我不想在我发送的 XML 文件中包含这个值。下面是我如何创建 XML 元素的示例:
new XElement("address",
new XElement("address1", CustomerDescription.StreetName + " " + cabCustomerDescription.HouseNumber),
new XElement("postalCode", cUstomerDescription.PostCode),
new XElement("city", customerDescription.PostalPlace),
new XElement("countryCode", customerDescription.CountryCode))
)
这是针对 CustomerDescription 中的所有属性完成的。我的问题是,我怎样才能做到这一点,如果数据库中不存在一个值,那么这个值不包含在 XML 文件中?我不希望它是空的,比如<countryCode></countryCode>,而是根本不存在。
【问题讨论】:
-
您为什么要尝试手动创建 SOAP 有效负载,而不是简单地创建和使用服务代理? SOAP 适用于具有非常具体、定义良好(实际上是标准化)形式的 XML 请求。不是 XML 文件
-
在 Visual Studio 中,您可以通过右键单击
References创建代理,选择Add Service Reference并将 URL 添加到 SOAP 服务的 WSDL -
我第一次使用 WCF 客户端时遇到了将客户端证书附加到我正在创建的客户端的问题。在无法解决这个问题大约 2 周后(我也在 stackoverflow 上发布了几次)我决定暂时这样做。
-
那么现在您要重新实现 WCF 了吗? WCF 工作 - 自 2008 年以来。HTTPS 开箱即用。 WS-Security 有效。签约作品。如果您之前的问题没有得到答案,可能是因为它们太模糊或不清楚。您不需要编写大量代码来使用证书。如果您只需要使用 HTTPS,您实际上不必编写任何代码。只需使用不同的绑定在配置中
-
您可能也应该使用 .NET Framework 创建一个代理,然后尝试简单地复制代码。大多数问题是由代理生成器引起的。生成的代码使用或多或少可用的类。您可能必须使用
CustomBinding而不是WSHttpBinding。您还可以在 .NET Framework 库中创建代理,然后添加对该库的引用。 .NET Core 会发出警告,但只要您的代码在 Windows 上运行,您就可以忽略它们。我以这种方式在 .NET Core 应用程序中使用AlphaFS