У меня есть другие сообщения, в которых я работал с отправкой данных на принтер UPnP. В основном создание контрольной точки с нуля (это все еще POC, и я буду реализовывать несколько типов устройств, поэтому сначала я хочу получить базовое понимание). Пока я могу открыть принтер, запросить задание на печать и вернуть URL-адрес приемника данных для публикации печатаемого контента. На данный момент я пытаюсь пост с простыми данными Xhtml, но запрос, кажется, тайм-аут каждый раз, за исключением следующего:UPnP POST to Printers Data Sink URI
The remote server returned an error: NotFound.
at System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state)
at System.Net.Browser.ClientHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
at System.Net.WebClient.GetWebResponse(WebRequest request, IAsyncResult result)
at System.Net.WebClient.DownloadBitsResponseCallback(IAsyncResult result)
Если я ударил URL в браузере, я получаю обратно HTTP 405 Method Not Allowed
Мне интересно, игнорирует ли сервер сообщение из-за плохих данных, или я пропускаю заголовки или что-то в этом роде.
Я уже прошел через документы на upnp.org для службы Printer Basic вместе с SOAP 1.1 UPnP Profile, оба из которых очень помогли получить, насколько я знаю.
У кого-нибудь есть мысли?
Вот копия моего XHTML:
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML-Print 1.0//EN\" \"http://www.w3.org/MarkUp/DTD/xhtml-print10.dtd\">
<html xmlns=\"http://www.w3.org/1999/xhtml\">
<head>
<title>test</title>
</head>
<body>
<div>hello world</div>
</body>
</html>
Я использую C# для создания и отправки HttpWebRequest
. Вот код, который делает это (у меня есть пара вариантов, другие с помощью WebClient
)
private void SendToPrinter(string printUri, string content)
{
var request = WebRequest.Create(new Uri(printUri)) as HttpWebRequest;
request.Method = "POST";
request.ContentType = "text/xml; charset=\"utf-8\"";
request.ContentLength = content.Length;
request.Headers[SoapHeaderName] = CreateJobHeader; // this probably isn't necessary
request.BeginGetRequestStream(ar =>
{
var requestStream = request.EndGetRequestStream(ar);
using (var sw = new StreamWriter(requestStream))
{
sw.Write(content);
sw.Close();
}
request.BeginGetResponse(a =>
{
var response = request.EndGetResponse(a);
var responseStream = response.GetResponseStream();
using (var sr = new StreamReader(responseStream))
{
var results = sr.ReadToEnd();
}
}, null);
}, null);
}
сырья разместить данные стельки
POST http://10.20.201.90/upnp/print/1d153438-1e90-1f0b-8b54-984be15df0fe HTTP/1.1
Content-Type: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:device:Printer:1#SendDocument"
Host: 10.20.201.90
Content-Length: 482
Expect: 100-continue
<?xml version="1.0" encoding="UTF-8"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><u:SendDocument xmlns:u="urn:schemas-upnp-org:device:Printer:1"><html xmlns="http://www.w3.org/1999/xhtml"><head><title>test</title></head><body><div>hello world</div></body></html></u:SendDocument></s:Body></s:Envelope>
Является бродячая '" 'после закрытия тега HTML опечатка? Вы помнить, чтобы избежать XHTML, если его внутри SOAP messsage. Если ни один из этих помощи, вы можете показать все POST (т.е. HTTP заголовков + SOAP, а также xhtml)? – simonc
Конец цитаты был типом. Я обновлю вопрос с моими данными запроса. – earthling
Вы не указали тело запроса. Каково значение 'content' в' SendToPrinter'? Вы форматируете его как сообщение SOAP? – simonc