Я уже два дня бьюсь головой об стену, так что, надеюсь, кто-нибудь может мне помочь. У меня есть веб-служба RESTful, которую я написал с использованием WCF; на самом деле ничего, только два метода, которые принимают один строковый параметр и также возвращают строку. И параметр, и возвращаемое значение являются прямыми XML.
[ServiceContract]
public interface IService
{
[OperationContract]
[WebGet(UriTemplate = "/method1/{data}", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Xml, RequestFormat = WebMessageFormat.Xml)]
string Method1(string data);
[OperationContract]
[WebGet(UriTemplate = "/method2/{data}", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Xml, RequestFormat = WebMessageFormat.Xml)]
string Method2(string data);
}
Ради аргумента скажем, что реализация обоих этих методов выглядит следующим образом:
public string Method1(string data)
{
return string.Format("You entered: {0}", data);
}
Если я захожу на http: //myuri.com/service.svc/method1/foo, в браузер записывается следующее:
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">You
entered: foo</string>
Это прекрасно работает, но если я изменю URL-адрес на: http: //myuri.com/service.svc/method1/, я получу 400 (неверный запрос). Поэтому я включил некоторые трассировщики, чтобы увидеть, что происходит, используя следующий код:
<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="All">
<listeners>
<add name="traceListener"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData= "c:\Traces.svclog" />
</listeners>
</source>
</sources>
Как видите, я использую значение переключателя «Все» для захвата каждого события, которое происходит во время выполнения этой службы. Я пробежал несколько раз, используя формат URL, который работает, чтобы убедиться, что трассировщики работали и были. Затем я перешел по URL-адресу, содержащему тег XML foo, и получил ошибку 400, как и ожидалось, но когда я вернулся к файлу журнала, никакой дополнительной информации к его концу не было. Это заставляет меня поверить, что ошибка 400 отображается до того, как служба WCF будет вызвана.
Наконец, я переключил методы с методов 'GET' на методы 'POST', написал немного кода, используя WebRequest / WebResponse с тем же результатом. Сейчас я прочитал несколько постов, в которых говорится об использовании XmlSerializer на стороне клиента для отправки данных в службу, но это противоречит цели этой службы. Хотя я использую .NET для написания сервиса, вполне вероятно, что PHP или классические ASP-скрипты будут подключаться к этому сервису, и они, очевидно, не имеют доступа к XmlSerializer.
Итак, мой вопрос на миллион долларов таков: возможно ли отправить «сырой» XML-запрос на веб-сервис RESTful, разработанный в WCF, и, если да, то как?
P.S.
XML, входящий и выходящий из сервиса, не основан на каком-либо материальном объекте, это просто структура, которую я создал для использования с этим сервисом. Входящий XML анализируется через XPath, значения помещаются в большую строку XML и передаются во внешний API. Результаты этого API обрабатываются, а затем возвращаются моей службой RESTful.
Любая помощь будет принята с благодарностью !!