SO (http://stackoverflow.com/questions/5801128/flat-wsdl-for-wcf-4-service) でこのサービス ホストを見つけ、それを使用して、必要なクラスのプロパティを特定しました。デフォルトの true の代わりに nillable=false にしてください。私はそれを行うことができましたが、この機能を自動化するためのロジックを実装する必要があります。
ホスト:
using System;
using System.Collections;
using System.Collections.Generic;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;
using System.Xml.Schema;
using ServiceDescription = System.Web.Services.Description.ServiceDescription;
namespace Thinktecture.ServiceModel.Extensions.Description {
public class FlatWsdl : IWsdlExportExtension, IEndpointBehavior {
public void ExportContract(WsdlExporter exporter, WsdlContractConversionContext context) {}
public void ExportEndpoint(WsdlExporter exporter, WsdlEndpointConversionContext context) {
XmlSchemaSet schemaSet = exporter.GeneratedXmlSchemas;
ProcessNillable(schemaSet);
...
...
}
private static void WalkTheParticle(XmlSchemaParticle particle)
{
if (particle is XmlSchemaElement) {
XmlSchemaElement elem = particle as XmlSchemaElement;
Console.WriteLine(elem.Name);
if (elem != null && String.Compare(elem.Name, "name", false) == 0)
{
elem.IsNillable = false; //This works!
Console.WriteLine("Bazinga!");
}
if (elem.RefName.IsEmpty) {
XmlSchemaType type = (XmlSchemaType)elem.ElementSchemaType;
if (type is XmlSchemaComplexType) {
XmlSchemaComplexType ct = type as XmlSchemaComplexType;
if (ct.QualifiedName.IsEmpty) {
WalkTheParticle(ct.ContentTypeParticle);
}
}
}
}
else if (particle is XmlSchemaGroupBase)
//xs:all, xs:choice, xs:sequence
{
XmlSchemaGroupBase baseParticle = particle as XmlSchemaGroupBase;
foreach (XmlSchemaParticle subParticle in baseParticle.Items)
{
WalkTheParticle(subParticle);
}
}
}
private static void AddImportedSchemas(XmlSchema schema, XmlSchemaSet schemaSet, List<XmlSchema> importsList) { ... }
private static void RemoveXsdImports(XmlSchema schema) { ... }
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) {}
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) {}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) {}
public void Validate(ServiceEndpoint endpoint) {}
}
}
サンプル プロジェクトで動作するようになりました。これを実際のプロジェクトに配置する必要があります。約 80 のコントラクトと、それぞれが多くのプロパティを持つのに十分な複雑さを備えています。必須のものとそうでないものがあります。必要なものの nillable=true のキャンセルを自動化する方法を理解する必要があります。上記の方法[DataMember(IsRequired=True)]
でプロパティを見つけるのに役立つことを期待していました。WalkTheParticle()
ただし、メソッド内に入ると、要素の名前を除いて、これを機能させるために関連付けることができる実際のものはなく、nil 不可としてマークするプロパティのリストを維持するのは本当に頭痛の種になります。より良い解決策を探しています。