Я настраиваю веб-сервис на c # и они вызывают его с помощью perl Soap :: Lite. Я пытаюсь заставить программу удалить пространство имен prefox и вместо этого определить полное пространство имен как атрибут xmlns в теге action. Сгенерированный запрос выглядит следующим образом
<soap:Envelope
soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
xmlns:s="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"
xmlns:tns="https://mynamespace.org"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soap:Body>
<tns:myMethod>
<name xsi:type="s:string">First Cycle</name>
<desc xsi:type="s:string"> The Description</desc>
</tns:myMethod>
</soap:Body>
</soap:Envelope>
Код, который сгенерировал запрос выше, это
use strict ;
use warnings ;
use SOAP::Lite +trace => [ transport => sub { print $_[0]->as_string } ];;
my $ns = "https://mynamespace.org";
my $HOST = "http://localhost:54387/WebService.asmx";
my $wsdl = "http://localhost:54387/WebService.asmx?wsdl";
my $soap = SOAP::Lite->service($wsdl);
$soap->default_ns($ns);
my $som = $soap->myMethod(
'First Cycle', 'The Description'
);
die $som->fault->{ faultstring } if ($som->fault);
print $som->result, "\n";
Параметры, приведенные выше, показывают нулевое значение в веб-сервисе, поскольку C # анализирует параметры как находящиеся в разных пространствах имен. вместо префикса я бы хотел, чтобы действие выглядело так
<myMethod xmlns="https://mynamespace.org">
Я пытался использовать
my $soap = SOAP::Lite->new( proxy => $HOST);
вместо описания услуги. Это работает, но параметры изменяются примерно так <c-sysgen3 xsi:type="s:string"><c-sysgen3>
Я хочу, чтобы запрос выглядел так
<soap:Envelope
soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
xmlns:s="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"
xmlns:tns="https://mynamespace.org"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soap:Body>
<myMethod xmlns="https://mynamespace.org">
<name xsi:type="s:string">First Cycle</name>
<desc xsi:type="s:string"> The Description</desc>
</myMethod>
</soap:Body>
</soap:Envelope>
или как это
<soap:Envelope
soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
xmlns:s="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"
xmlns:tns="https://mynamespace.org"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soap:Body>
<tns:myMethod>
<tns:name xsi:type="s:string">First Cycle</tns:name>
<tns:desc xsi:type="s:string"> The Description</tns:desc>
</tns:myMethod>
</soap:Body>
</soap:Envelope>
Я должен упомянуть, что я не могу явно определять теги элемента в perl, например
$soap->call('myMethod',
SOAP::Data->name('name')->value( 'First Cycle' ),
SOAP::Data->name('desc')->value('The Description') );
Пожалуйста, помогите (-:
Редактировать: моя версия perl - 5.28.1, а версия SOAP :: Lite - 1.27.
Я также использую .net Framework 4.5
Редактировать: вероятно, мне следует добавить реализацию своего веб-сервиса
namespace WebService
{
[WebService(Namespace = "https://mynamespace.org")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class SoapService : System.Web.Services.WebService
{
[WebMethod]
public string myMethod(string name, string desc)
{
// Implementation here
}
}
}