WCF を使用して Web サービスを作成しました。データ コントラクトを使用して WSDL/XSD に制約と制限を設定する方法がわかりません。
制約を使用して XSD2 スキーマを改善し、このカスタム スキーマを既存のサービスにバインドするとどうなりますか? その場合、改善された WSDL をサービスで公開するにはどうすればよいですか? それ以外の場合、WCF サービスのメタデータを設定する他の方法はありますか?
WCF を使用して Web サービスを作成しました。データ コントラクトを使用して WSDL/XSD に制約と制限を設定する方法がわかりません。
制約を使用して XSD2 スキーマを改善し、このカスタム スキーマを既存のサービスにバインドするとどうなりますか? その場合、改善された WSDL をサービスで公開するにはどうすればよいですか? それ以外の場合、WCF サービスのメタデータを設定する他の方法はありますか?
XSD と WSDL を混同しないでください。これはまったく別のものです。
あなたの質問によると - RiaServicesを使用してみてください。次のようなコードを書くことができます
public class Meeting
{
[Key]
public int MeetingId { get; set; }
[Required]
public DateTime Start { get; set; }
[Required]
public DateTime End { get; set; }
[Required]
[StringLength(80, MinimumLength = 5)]
public string Title { get; set; }
public string Details { get; set; }
[Required]
[RegularExpression(@"\d{1,3}/\d{4}",
ErrorMessage = "{0} must be in the format of 'Building/Room'")]
public string Location { get; set; }
[Range(2, 100)]
[Display(Name = "Minimum Attendees")]
public int MinimumAttendees { get; set; }
[Range(2, 100)]
[Display(Name = "Maximum Attendees")]
public int MaximumAttendees { get; set; }
}
私が知っているように、制約と制限を使用して WSDL を改善する唯一の方法は、DataContract クラスを制限属性でマークすることです (正しくない場合は修正してください)。
これは一般的な問題のようです。サービスメタデータは、データコントラクトを記述します。つまり、検証情報のない、交換されたデータの構造です。
私は、サービスレイヤーの上に検証レイヤーを実装することでこの問題を解決してきました。それは次のようになります:
WSDLに加えて、サービスの作成者と利用者は、データコントラクトの単なる構造に加えて、すべての検証の詳細を記述する洗練されたXSDにも同意します。
各パーティ(xml)は、洗練されたXSDに対してデータコントラクトをシリアル化して検証します。
XSDに対して要求を検証するサービスメソッドのサンプル「擬似コード」。
public string MyServiceMethod(MyDataType m){
string s = XmlSerialize(m);
if( XSDValidate(s) ){
return ProcessRequest(m);
}else{
return BuildErrorResponse("The request is not compliant with the contract");
}
}
サービスコンシューマーは、サーバーに送信する前に要求データを検証するための同様のロジックを実装することもできます。
Web サービスを作成するには、基本的に次の 2 つの方法があります。
最初にコードします。クラスを作成し、それを datacontract クラスといくつかの属性としてマークします。これをコンパイルすると、Web サービスの WSDL がクラスから生成されます。これは簡単な方法であり、多くの場合、WSDL を十分に制御できます。
まずスキーマ。手動で WSDL を作成し、ツール ( WSCF.Blueや など) を使用して WSDL から datacontract クラスを生成します。これにより、WSDL スキーマを完全に制御できるようになりますが、私の経験では、datacontract クラスよりも WSDL を作成する方が手間がかかります。