Нулевые параметры в C # WebService - PullRequest
1 голос
/ 13 октября 2011

Мне передали WSDL WebService, который я должен реализовать, и сгенерировал из него его базовую структуру (пробовал и с svcutils.exe из .NET SDK, и с плагином WSDL.blue для Visual Studio).Кто-то будет использовать этот веб-сервис, и я не могу изменить тип запросов, которые они делают.Вот пример SOAP-запроса, который я получил от своего клиента:

<env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'>
<env:Header></env:Header>
<env:Body>
<ns1:setNetworkActivatorResponse xmlns:ns1='http://client.response.ws.meh/'>
    <OrderResponse>
        <orderHeader>
            <clientID>trD-125205</clientID>
            <description>0</description>
            <operation>trD</operation>
            <orderKey>
                <applicationContext>
                    <URL>http://xxx.xxx.xxx.xxx:8181/</URL>
                    <hostName>xxx.xxx.xxx.xxx</hostName>
                </applicationContext>
<applicationDN>XYPT</applicationDN>
                    <primaryKey>170809</primaryKey>
                </orderKey>
                <priority>1</priority>
            </orderHeader>
            <info>
                Yadda Yadda Yadda text.
            </info>
        </OrderResponse>
    </ns1:setNetworkActivatorResponse>
    </env:Body>
    </env:Envelope>

Этот запрос вызывает правильный метод на WebServer (setNetworkActivatorResponse ()), однако параметр OrderResponse метода передается как ноль.Я считаю, что это как-то связано с пространствами имен, потому что, если я изменю запрос и добавлю пространство имен ns1 в OrderResponse (например, <ns1:OrderResponse> </ns1:OrderResponse>), параметр будет передан правильно, и объект OrderResponse будет доступен в методе C #.

Мой метод определен как типичный C # .NET WebService:

[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[WebService(Namespace = "http://client.response.ws.meh/")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://client.response.ws.meh/")]
[System.ServiceModel.ServiceContractAttribute(Namespace = "http://client.response.ws.meh/", ConfigurationName = "ResponseClientWebService")]
public class ResponseClientWebService : System.Web.Services.WebService
{

    [WebMethod]
    public void setNetworkActivatorResponse(OrderResponse OrderResponse)
    {
        String meh = OrderResponse.info;
    }

}

А вот мой класс OrderResponse:

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.233")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://client.response.ws.na.agorang.ptinovacao.pt/")]
public partial class OrderResponse
{
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string messageID;

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
public OrderHeader orderHeader;

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string info;
}

Необходимые классы (OrderResponse и подобные) определены и реализованытакже.Любая идея, что я могу изменить в своем коде (видя, как я не могу изменить запрос клиента на наличие пространства имен ns1 на OrderResponse), чтобы он мог принимать запрос SOAP?Спасибо!

1 Ответ

0 голосов
/ 14 октября 2011

Строка XmlTypeAttribute в классе OrderResponse - это причина, по которой вашему веб-сервису требуется существование в определенном пространстве имен. Чтобы исправить это, я уверен, что вы можете просто удалить эту строку кода из вашего файла.

Однако удаление этой строки из сгенерированного кода не будет оптимальным решением, потому что регенерация из WSDL вернет эту строку обратно в код. В идеале вы должны изменить WSDL так, чтобы элемент определялся как существующий в пустом целевом пространстве имен.

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