Java Webservice и клиент .NET отбрасывают объекты DateTime - PullRequest
1 голос
/ 24 марта 2009

Видя что-то странное между веб-сервисом Java и клиентом .NET, разговаривающим с ним. Мы отправляем объект туда и обратно со свойством DateTime. Вроде как (сгенерировано из WSDL):

[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://ournamespace.com/")]
public partial class myClass {
    private System.DateTime expirationDateField;
    private string nameField;

    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public System.DateTime expirationDate {
        get {
            return this.expirationDateField;
        }
        set {
            this.expirationDateField = value;
        }
    }

    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string name {
        get {
            return this.nameField;
        }
        set {
            this.nameField = value;
        }
    }
}

Мы получаем объекты с датами просто отлично, но когда мы отправляем их обратно в веб-службу, свойство expirationDate показывалось как null. Мы посмотрели на необработанный XML, который получал Java-сервер, и тега expirationDate там не было, вроде как:

<myClass><name>My Name</name></myClass>

(Это не точный XML, но достаточно близко). Я дважды проверил, и expirationDate определенно установлен на клиенте .NET перед отправкой. XSD для WSDL не выглядит странно:

<xs:element name="Expiration" type="xs:dateTime" minOccurs="0"/>

Мы используем тот же тип для других вещей, которые также хорошо работают. На стороне .NET мы используем инструмент wsdl.exe для генерации классов и кода.

Еще один шаг, который мы могли бы сделать, - это увидеть XML, сгенерированный .NET, прежде чем он вызовет веб-сервис, но я не знаю, как это сделать. Любые другие мысли или предложения?

Ответы [ 2 ]

4 голосов
/ 24 марта 2009

Если тип значения является необязательным в схеме, WSDL.EXE создает свойство для значения и свойство bool, чтобы указать, присутствует ли значение или нет. У вас должно быть свойство ExpirationSpecified, для которого нужно установить значение true , если вы хотите отправить дату истечения срока действия, и false , если вы этого не сделаете.

1 голос
/ 20 августа 2013

В дополнение к ответу Джона, который я принимаю в качестве решения, я хотел бы указать полный механизм. Это происходит всякий раз, когда в качестве свойства типа объекта веб-службы используется Java-тип «обнуляемый», который соответствует типу C # «не обнуляемый». Например, если используются простые типы-оболочки в Java, такие как "Integer", "Boolean", эти типы соответствуют типу int, bool, которые не могут быть обнулены. Таким образом, свойства "* Specified" должны быть установлены для того, чтобы их отправлять.

Для получения оригинальной документации вы можете обратиться:
http://msdn.microsoft.com/en-us/library/exchange/bb402199%28v=exchg.140%29.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...