4

WSDL と、文字列ではなく DateTime であると思われるすべてのプロパティから、新しいサービス参照を作成しようとしています。

たとえば、次の Contact の xsd 定義は次のとおりです。

<s:complexType name="Contact">
    <s:sequence>
        <s:element minOccurs="0" maxOccurs="1" name="Address" type="tns:Address" />
        <s:element minOccurs="0" maxOccurs="1" name="Email" type="s:string" />
        ...
        <s:element minOccurs="1" maxOccurs="1" name="BirthDate" type="s:date" />
</s:sequence>

BirthDate の型は s:date ですが、生成された型 (Reference.cs 内) は文字列です。

internal partial class Contact : object, IExtensibleDataObject, INotifyPropertyChanged
{
    [OptionalField]
    private MembershipMgmtMediator.Address AddressField;

    [OptionalField]
    private string EmailField;

    private string BirthDateField;
}

Web プロジェクトを作成し、それをサービス参照ではなく Web 参照として追加すると、正しく DateTime になります。これは、wsdl.exe と svcutil.exe が舞台裏で動作する方法と関係があると思いますが、それでも、このプロパティが DateTime であることを Visual Studio に正しく認識させる方法を見つけようとしています。

4

3 に答える 3

5

これらの質問には、いくつかの良い情報があります: How to generate xs:Date in WCF OperationContract parameterおよびBest practice for DateTime serialization in .NET 3.5

アレックスが質問に対するコメントで述べているように、WCF は型をサポートしていませんxs:dateDataContractSerializerただし、上記の質問は がそれを処理できることを示していますが、デフォルトではそのタイプをサポートしていないと言う方がおそらくより正確ですXmlSerializer

反対の比較については、このリンクを参照してください。DataContractSerializerXmlSerializer

私が実行した場合:

svcutil http://my_web_site?wsdl /ser:XmlSerializer /d:C:\temp

次に、次のような WSDL フラグメント:

<s:complexType name="Contact">
    <s:sequence>
        <s:element minOccurs="1" maxOccurs="1" name="BirthDate" type="s:date" />
    </s:sequence>
</s:complexType>

このクラスは生成されましたか:

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/")]
public partial class Contact
{

    private System.DateTime birthDateField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(DataType="date", Order=0)]
    public System.DateTime BirthDate
    {
        get
        {
            return this.birthDateField;
        }
        set
        {
            this.birthDateField = value;
        }
    }
}

このsvcutil呼び出しにより、 と の 2 つのファイルが生成さService1.csれますoutput.config。プロジェクトにコード ファイルを含め、system.serviceModelビットを構成ファイル (つまり、web.config または app.config) に追加すると、通常どおりサービスを呼び出すことができます。例えば:

Service1SoapClient client = new Service1SoapClient("Service1Soap");
var contact = client.GetContact();

このアプローチには欠点がないわけではありません。パラメータなしで生成された場合、Service1.csファイルは著しく異なり、、、/ser:XmlSerializerなどの追加のクラスが取得されます。これらのクラスがサービスとの対話において重要である場合、私のアプローチはうまくいかないかもしれません。WebMethodNameRequestWebMethodNameRequestBodyWebMethodNameReponseWebMethodNameReponseBody

編集:

null 許容プロパティに関しては、この質問にいくつかの良い情報があります: svcutil.exe - null 許容フィールドを許可しないで生成されたプロキシ

生成されたプロキシ クラスで null 許容のプロパティを取得するにnillableは、WSDL でフィールドを設定する必要があります。だから、このようなもの:

<s:element minOccurs="0" maxOccurs="1" name="SomeProperty" type="s:date" nillable="true" />

public System.Nullable<System.DateTime> SomePropertyプロキシ クラスで呼び出されるプロパティを生成します。

ただし、あなたの場合、プロパティを使用して、SomePropertySpecifiedプロパティの有無を示すことができます。これらの種類のプロパティは、 がある場合に生成されますminOccurs="0"

日付のフォーマットに関しては、よくわかりません。値は、オプションのタイムゾーン情報 ( w3.orgxs:date )を含む yyyy-mm-dd を意図しています。オラクルが異なる形式の日付を期待している場合、それらがどのように値になるのか疑問に思います。xs:date

利用しようとしているサービスに関して提供できるドキュメントやその他の情報はありますか?

編集2:

「日付はデータベース形式でなければならない」という正確な内容が少しわかりません。オラクルのドキュメントで意味します。タイプが である場合、xs:dateそれらをデータベース形式にシリアル化すると、それはもはやxs:date?ではなくなったことを確実に意味します。

それでも、その点で試してみることがいくつかあります。

この日付ビジネスが物事にどのように影響するかを確認するには、Web サービスにいくつかのクエリを送信して実験する必要があるかもしれません。

それらの*IsSpecifiedパラメーターが存在しないと確信していますか? 上記の私のContactクラスを例として使用するminOccurs=0には、プロパティで、クラスに という追加のプロパティBirthDateを与えます。ContactBirthDateIsSpecified

于 2013-01-28T05:05:25.823 に答える
1

私は nick_w の答えが質問を十分にカバーしていると信じていますが (そして私は彼に報奨金を授与しています)、使用するだけXmlSerializerでは不十分な特定のケースで使用するソリューションを提供しています。DateTime最後に、カスタム書式指定子を使用して、オブジェクトを文字列に変換する拡張機能を使用するつもりだと思います。

public static class SoapUtils
{
    public static string ToOraDate( this DateTime? dt )
    {
        return dt != null ? dt.Value.ToString("dd-MMM-yyyy",
                                              CultureInfo.InvariantCulture) : 
    }
}

// Calling a service
someDate = DateTime.Now;
service.SomeMethod( someDate.ToOraDate() );
于 2013-01-31T11:15:35.247 に答える
0

これは本当の解決策ではありませんが、回避策として機能する可能性があると思います。それは汚れていて醜いことは知っていますが、コードに String を含めるよりはましかもしれません。

独自のクラス ( などAddress) は適切に処理されるため、Dateプロジェクトとスキーマに含めるクラスの周りに単純なラッパーを作成できます。クラスには、Dateプロパティまたはフィールドとそれにゲッターしかありません。

于 2013-01-25T09:51:47.770 に答える