8

WCF を使用して Web サービスを作成しました。データ コントラクトを使用して WSDL/XSD に制約と制限を設定する方法がわかりません。

制約を使用して XSD2 スキーマを改善し、このカスタム スキーマを既存のサービスにバインドするとどうなりますか? その場合、改善された WSDL をサービスで公開するにはどうすればよいですか? それ以外の場合、WCF サービスのメタデータを設定する他の方法はありますか?

4

3 に答える 3

3

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 クラスを制限属性でマークすることです (正しくない場合は修正してください)。

于 2012-06-19T11:29:05.693 に答える
1

これは一般的な問題のようです。サービスメタデータは、データコントラクトを記述します。つまり、検証情報のない、交換されたデータの構造です。

私は、サービスレイヤーの上に検証レイヤーを実装することでこの問題を解決してきました。それは次のようになります:

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");
    }
}

サービスコンシューマーは、サーバーに送信する前に要求データを検証するための同様のロジックを実装することもできます。

于 2012-06-23T05:45:51.487 に答える
1

Web サービスを作成するには、基本的に次の 2 つの方法があります。

  1. 最初にコードします。クラスを作成し、それを datacontract クラスといくつかの属性としてマークします。これをコンパイルすると、Web サービスの WSDL がクラスから生成されます。これは簡単な方法であり、多くの場合、WSDL を十分に制御できます。

  2. まずスキーマ。手動で WSDL を作成し、ツール ( WSCF.Blueや など) を使用して WSDL から datacontract クラスを生成します。これにより、WSDL スキーマを完全に制御できるようになりますが、私の経験では、datacontract クラスよりも WSDL を作成する方が手間がかかります。

于 2012-06-25T16:36:23.310 に答える