Тип веб-службы .Net - PullRequest
       49

Тип веб-службы .Net

1 голос
/ 11 февраля 2010

Мне нужно создать веб-сервис .Net (о нем не может быть и речи), который должен получать xml и возвращать xml. Я изначально настроил функцию так:

[WebMethod]
public string myFunc(string xmlRequest)
{

Как я могу изменить тип содержимого HTTP POST на text / xml? Кроме того, я возвращаю ответ xml в виде строки, но на странице справки веб-службы говорится, что ответ будет:

HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://www.mysite.com/myFunc">string</string>

Мне нужно как-то удалить этот корневой <string> элемент.

Этот веб-сервис вызывается другой компанией, которая, вероятно, не использует .Net для публикации XML в виде text / xml на моей конечной точке.

Ответы [ 5 ]

1 голос
/ 21 июня 2012

Чтобы удалить строку, вам нужно сделать возвращаемый параметр xml следующим образом:

public **System.Xml.XmlDocument** MyFunc(string xmlRequest)

Это сделает ответ;

HTTP/1.1 200 OK

Content-Type: text/xml; charset=utf-8

Content-Length: length


<?xml version="1.0" encoding="utf-8"?>
xml
1 голос
/ 11 февраля 2010

У меня есть платформа веб-службы с открытым исходным кодом (работает на .NET и Mono), которая значительно упрощает усилия, необходимые для создания веб-служб. Он автоматически настраивается для предоставления конечных точек XML (+ REST), JSON (+ REST), SOAP 1.1 / 1.2 для всех ваших веб-служб:

Доступно с:

http://www.servicestack.net/

А также доступна живая демонстрация javascript и silverlight (работает на CentOS / Nginx) по адресу: http://www.servicestack.net/ServiceStack.Examples.Clients/Default.htm

И доступное онлайн-руководство, описывающее процесс создания и использования веб-сервисов (для MonoTouch, но применимых везде), доступно здесь:

http://www.servicestack.net/monotouch/remote-info/

0 голосов
/ 11 февраля 2010

Хорошо, элемент <string> отображается как есть, потому что ваш метод определен как возвращающий строку. За кулисами .NET фактически просто берет любой объект, возвращаемый вашим методом, и сериализует его. Сериализованная строка представляется как <string>actual string contents</string>.

То, что вы хотите сделать, это либо каким-либо образом вернуть объект, который сериализуется точно в нужное вам сообщение, либо, если ваша строка здесь действительно содержит XML, записать его непосредственно в поток ответов.

Я на самом деле никогда не пробовал это с помощью [WebMethod], но он может работать примерно так:

[WebMethod]
public void myFunc(string xmlRequest)
{
    var myXml = @"<?xml version="1.0" encoding="utf-8"?><myRoot><myElement /></myRoot>";
    Response.ContentType = "text/xml";
    Response.Write(myXml);
    Response.Flush();
    Response.Close();
}

Как примечание, WCF фактически делает то же самое. Если вы определяете операцию службы WCF:

[OperationContract]
public string myFunc()
{
    return "hi";
}

Возвращенный XML (который на самом деле дополнительно обернут в SOAP) - <string>hi</string> Так же, как у вас здесь с классическими веб-сервисами. Немного больше боли «развернуть» этот XML в WCF. Вы должны сделать собственный писатель сообщений, IIRC.

0 голосов
/ 11 февраля 2010

Подождите, вы хотите опубликовать свои данные в формате XML, но получить их обратно в виде строки XML? Если я не понял неправильно то, что вы говорите, это, безусловно, звучит так, как будто вы делаете, и, если честно, это кажется неправильным.

Не можете ли вы проанализировать строку в XML-документе в веб-сервисе, и по какой причине другая компания не может справиться с XML-документом с одним узлом? Разве они не могут получить строковое значение из этого единственного узла, а затем проанализировать строку XML самостоятельно?

0 голосов
/ 11 февраля 2010

Допустимый документ XML должен содержать корневой элемент. Это не XML, если только элемент string не существует. В противном случае это будет простой текстовый ответ.

...