从 PL/SQL 调用 Web 服务时得到不支持的媒体类型
Posted
技术标签:
【中文标题】从 PL/SQL 调用 Web 服务时得到不支持的媒体类型【英文标题】:Got Unsupported Media Type when calling web service from PL/SQL 【发布时间】:2014-03-05 09:11:54 【问题描述】:我编写了一些 PLSQL 代码来使用我在本地 PC 中创建的 Web 服务,但我总是遇到 Unsupported Media Type 异常,异常代码是 415。请参阅下面的代码:
PLSQL:
declare
l_param_list varchar2(512);
l_http_request UTL_HTTP.req;
l_http_response UTL_HTTP.resp;
l_response_text varchar2(32000);
l_soap_request varchar2(32000);
begin
-- service's input parameters
l_soap_request := '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<add xmlns="http://tempuri.org/">
<firstNum>3</firstNum>
<secondNum>4</secondNum>
</add>
</soap:Body>
</soap:Envelope>';
--http://localhost:64955/Service1.asmx?op=add
--16.158.161.7
dbms_output.put_line('length of l_soap_request :' || length(l_soap_request));
dbms_output.put_line('l_soap_request : ' || l_soap_request);
-- prepareint Request...
l_http_request := UTL_HTTP.begin_request ('http://localhost:64955/Service1.asmx'
,'POST'
,UTL_HTTP.HTTP_VERSION_1_1);
--...set header's attributes
UTL_HTTP.set_header(l_http_request,'Content-Type', 'text/xml; charset=utf-8');
UTL_HTTP.set_header(l_http_request,'Content-Type', length(l_soap_request));
UTL_HTTP.set_header(l_http_request,'SOAPAction','http://tempuri.org/add');
--...set input parameters
UTL_HTTP.write_text(l_http_request, l_soap_request);
-- get response and obtain received value
l_http_response := UTL_HTTP.get_response(l_http_request);
dbms_output.put_line('Response Received');
dbms_output.put_line('________');
dbms_output.put_line('Status Code : '||l_http_response.status_code);
--UTL_HTTP.read_text(l_http_response, l_response_text);
dbms_output.put_line('Reason Phase : '||l_http_response.reason_phrase);
--dbms_output.put_line(l_response_text);
--dbms_output.put_line('test1');
utl_http.read_text(l_http_response,l_response_text);
dbms_output.put_line('Response : ');
dbms_output.put_line(l_response_text);
--finalizing
UTL_HTTP.end_response(l_http_response);
exception
when UTL_HTTP.end_of_body then
UTL_HTTP.end_response(l_http_response);
dbms_output.put_line('test2');
end;
Web 服务是由 .NET 在 C# 中创建的:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
namespace Calculator
/// <summary>
/// Summary description for Service1
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
// [System.Web.Script.Services.ScriptService]
public class Service1 : System.Web.Services.WebService
[WebMethod]
public string HelloWorld()
return "Hello World";
[WebMethod]
public string add(string firstNum, string secondNum)
int p1 = Convert.ToInt32(firstNum);
int p2 = Convert.ToInt32(secondNum);
return (p1 + p2).ToString();
谁能帮我解决我的代码或媒体类型有什么问题,什么是正确的媒体类型或如何知道正确的媒体类型是什么?
【问题讨论】:
【参考方案1】:你正在用长度覆盖你的内容类型
UTL_HTTP.set_header(l_http_request,'Content-Type', length(l_soap_request));
你应该这样做:
UTL_HTTP.set_header(l_http_request,'Content-Length', length(l_soap_request));
【讨论】:
哦,MGD,那是我的错误。感谢您的帮助。以上是关于从 PL/SQL 调用 Web 服务时得到不支持的媒体类型的主要内容,如果未能解决你的问题,请参考以下文章
从 Java 调用 PL/SQL Web Toolkit 过程
调用 Restful Web 服务和更新数据库表的 PL/SQL 过程
如何在调用之前检查 Java Web 服务是不是已在 PL/SQL 中启动并运行