WCF: класс прокси-клиента выдает «Unmarshalling Error: непредвиденный элемент (uri:« http://ws.oscarehr.org/", local: «arg0»). Ожидаемые элементы: <{} arg0> ' - PullRequest
0 голосов
/ 17 января 2019

Как я могу исправить код и / или сгенерированный прокси-класс? Должен ли я изменить WSDL перед генерацией прокси-класса?

Я использовал svcutil.exe /namespace:*,Oscar.Facades.ScheduleService https://test -oscar.com / oscar / ws / ScheduleService? Wsdl для генерации прокси-классов для службы WCF, вызывающей Java-бэкэнд.

Я звоню в службу:

        ScheduleWsClient scheduleWsClient = new ScheduleWsClient(basicHttpBinding, new EndpointAddress(scheduleServiceUrl));
        appointmentTransfer[] appointmentsForDateRangeAndProvider = scheduleWsClient.getAppointmentsForDateRangeAndProvider(DateTime.Today.AddDays(2), DateTime.Today.AddDays(3), provider);

и получение ошибки:

System.ServiceModel.FaultException: 'Unmarshalling Error: непредвиденный элемент (uri: "http://ws.oscarehr.org/", local:" arg0 "). Ожидаемые элементы: <{} arg2>, <{} arg1>, <{} arg0> '

Из вышеприведенного сообщения об ошибке я понимаю, что arg0 относится к пространству имен по умолчанию "http://ws.oscarehr.org/", и фактически должно принадлежать ни одному пространству имен, которое должно было обеспечиваться с помощью объявления xmlns =" ​​". (Префиксы пространства имен также могут быть переопределены путем повторного выделения префикса во вложенной области видимости)

Отправленное тело выглядит так:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
	<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
		<getAppointmentsForDateRangeAndProvider xmlns="http://ws.oscarehr.org/">
			<arg0 xmlns="">2019-01-18T00:00:00-05:00</arg0>
			<arg1 xmlns="">2019-01-19T00:00:00-05:00</arg1>
			<arg2 xmlns="">1</arg2>
		</getAppointmentsForDateRangeAndProvider>
	</s:Body>
</s:Envelope>

в то время как при попытке выполнить этот запрос в SoapUI с любым из этих измененных полезных данных он работает:

<ws:getAppointmentsForDateRangeAndProvider xmlns:ws="http://ws.oscarehr.org/">
  <arg0 xmlns="">2019-01-18T00:00:00-05:00</arg0>
  <arg1 xmlns="">2019-01-19T00:00:00-05:00</arg1>
  <arg2 xmlns="">1</arg2>
</ws:getAppointmentsForDateRangeAndProvider>


<ws:getAppointmentsForDateRangeAndProvider xmlns:ws="http://ws.oscarehr.org/">
  <arg0>2019-01-18T00:00:00-05:00</arg0>
  <arg1>2019-01-19T00:00:00-05:00</arg1>
  <arg2>1</arg2>
</ws:getAppointmentsForDateRangeAndProvider>

На основе Понимание пространств имен XML статья, когда пространство имен по умолчанию объявлено для родительского элемента arg0, например

        <getAppointmentsForDateRangeAndProvider xmlns="http://ws.oscarehr.org/">

arg0 xmlns = "" означает, что мы можем объявить пространство имен по умолчанию выше.

мы объявляем пространство имен по умолчанию, просто устанавливая идентификатор пространства имен по умолчанию обратно в пустую строку. В результате элемент arg0 не принадлежит пространству имен.

Я действительно не понимаю, почему arg0 все еще принадлежит пространству имен по умолчанию: "http://ws.oscarehr.org/" несмотря на то, что я объявил об этом. Для меня все 3 запроса идентичны.

Обновление:

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
[System.ServiceModel.MessageContractAttribute(WrapperName="getAppointmentsForDateRangeAndProvider", WrapperNamespace="http://ws.oscarehr.org/", IsWrapped=true)]
public partial class getAppointmentsForDateRangeAndProvider
{

    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://ws.oscarehr.org/", Order=0)]
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public System.DateTime arg0;

    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://ws.oscarehr.org/", Order=1)]
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public System.DateTime arg1;

    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://ws.oscarehr.org/", Order=2)]
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string arg2;

    public getAppointmentsForDateRangeAndProvider()
    {
    }

    public getAppointmentsForDateRangeAndProvider(System.DateTime arg0, System.DateTime arg1, string arg2)
    {
        this.arg0 = arg0;
        this.arg1 = arg1;
        this.arg2 = arg2;
    }
}
...