Как я могу исправить код и / или сгенерированный прокси-класс?
Должен ли я изменить 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 =" ".
(Префиксы пространства имен также могут быть переопределены путем повторного выделения префикса во вложенной области видимости)
Отправленное тело выглядит так:
в то время как при попытке выполнить этот запрос в 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;
}
}