0

UPnP プリンターへのデータの投稿に取り組んでいる投稿が他にもいくつかあります。基本的にゼロからコントロール ポイントを作成します (これはまだ POC であり、複数のデバイス タイプに実装する予定なので、最初に基本的な理解を得ようとしています)。これまでのところ、プリンターを検出し、印刷ジョブを要求し、データ シンクの URL を取得して、印刷するコンテンツを投稿することができました。この時点で、単純な xhtml データを使用して POST を試みましたが、次の例外が発生するたびにリクエストがタイムアウトするようです。

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 プロファイルを調べました。

誰か考えがありますか?

これが私の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

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&lt;s:Envelope xmlns:s=&quot;http://schemas.xmlsoap.org/soap/envelope/&quot;&gt;&lt;s:Body&gt;&lt;u:SendDocument xmlns:u=&quot;urn:schemas-upnp-org:device:Printer:1&quot;&gt;&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;&lt;head&gt;&lt;title&gt;test&lt;/title&gt;&lt;/head&gt;&lt;body&gt;&lt;div&gt;hello world&lt;/div&gt;&lt;/body&gt;&lt;/html&gt;&lt;/u:SendDocument&gt;&lt;/s:Body&gt;&lt;/s:Envelope&gt;
4

1 に答える 1

0

私が印刷できなかった問題の 1 つは、プリンターがどのトレイから印刷するかを尋ねるように設定されていたことです。これにより、メッセージが印刷されなくなりました。これが最終的な SOAP メッセージです。私はそれを逃れませんでした。

<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">
  <s:Body>
    <html xmlns=\"http://www.w3.org/1999/xhtml\">
      <head><title>test</title></head>
      <body><div>hello world</div></body>
    </html>
  </s:Body>
</s:Envelope>
于 2013-10-02T17:37:03.990 に答える