ATLServer WebService 如何返回任意内容的 SOAP 消息给客户 —— 改写atlsoap.h
2007-03-24 22:25
609 查看
ATLServer WebService 如何返回任意内容的 SOAP 消息给客户
cheungmine@gmail.com
2007-3-24
(上篇文章存在问题,这里是可用的版本。)
如果想在下面的WebService方法中返回任意SOAP错误消息给客户,应该这样做:
// 宏定义,错误信息只支持英文半角
#define SOAP_FAULT(errCode, wszDetail) m_fault.m_soapErrCode = errCode; m_fault.m_strDetail = wszDetail
[align=left] [ soap_method ][/align]
[align=left] HRESULT HelloWorld(/*[in]*/ BSTR bstrInput, /*[out, retval]*/ BSTR *bstrOutput)[/align]
[align=left] {[/align]
[align=left] CComBSTR bstrOut(L"Hello ");[/align]
[align=left] bstrOut += bstrInput;[/align]
[align=left] *bstrOutput = bstrOut.Detach();[/align]
[align=left] [/align]
[align=left] SOAP_FAULT(SOAP_E_SERVER, L"Do you love me, my girl");[/align]
[align=left] return E_FAIL;[/align]
[align=left] }[/align]
[align=left][/align]
[align=left][/align]
[align=left]然而,m_fault参数未定义,我们需要把它加入到atlsoap.h文件中。打开atlsoap.h,加入下面的代码,注意红色部分是我加的,其他地方不要改变:[/align]
[align=left][/align]
template <typename THandler>
class CSoapHandler :
public CSoapRootHandler,
public CComObjectRootEx<CComMultiThreadModel>,
public IRequestHandlerImpl<THandler>
{
protected:
HTTP_CODE m_hcErr;
CHttpResponse *m_pHttpResponse;
// heap for SOAP requests
CWin32Heap m_heap;
// default heap is COM heap (SOAP Servers can double as COM objects)
CComHeap m_comHeap;
// CL2: 这里添加成员用来返回用户定制的错误,而不是根据HRESULT值生成错误
CSoapFault m_fault;
public:
BEGIN_COM_MAP(CSoapHandler<THandler>)
COM_INTERFACE_ENTRY(ISAXContentHandler)
COM_INTERFACE_ENTRY(IRequestHandler)
END_COM_MAP()
CSoapHandler()
:m_pHttpResponse(NULL), m_hcErr(HTTP_SUCCESS)
{
SetMemMgr(&m_comHeap);
}
void SetHttpError(HTTP_CODE hcErr)
{
m_hcErr = hcErr;
}
HRESULT SoapFault(
SOAP_ERROR_CODE errCode,
const wchar_t *wszDetail,
int cchDetail)
{
ATLASSUME( m_pHttpResponse != NULL );
SetHttpError(AtlsHttpError(500, SUBERR_NO_PROCESS));
m_pHttpResponse->ClearHeaders();
m_pHttpResponse->ClearContent();
m_pHttpResponse->SetContentType("text/xml");
m_pHttpResponse->SetStatusCode(500);
if (m_fault.m_soapErrCode == SOAP_E_UNK)
{
if (wszDetail != NULL)
{
if (cchDetail < 0)
{
cchDetail = (int) wcslen(wszDetail);
}
_ATLTRY
{
m_fault.m_strDetail.SetString(wszDetail, cchDetail);
}
_ATLCATCHALL()
{
ATLTRACE( _T("CSoapHandler::SoapFault -- out of memory. " ) );
return E_OUTOFMEMORY;
}
}
m_fault.m_soapErrCode = errCode;
}
m_fault.GenerateFault(m_pHttpResponse);
return S_OK;
}
... ...
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left]以上就这些就可以了,运行就看到返回的错误信息“<Detail>Do you love me, my girl</Detail>”。[/align]
[align=left][/align]
[align=left]我使用VS2005+ATL8来写WebService。用其他语言写的WebService不知道存在这些问题不。如果要用好ATL Server,对它的代码做些修改是很正常的。我修改了它很多默认的实现,比如CSessionStateService、CPerfMon等类。[/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
cheungmine@gmail.com
2007-3-24
(上篇文章存在问题,这里是可用的版本。)
如果想在下面的WebService方法中返回任意SOAP错误消息给客户,应该这样做:
// 宏定义,错误信息只支持英文半角
#define SOAP_FAULT(errCode, wszDetail) m_fault.m_soapErrCode = errCode; m_fault.m_strDetail = wszDetail
[align=left] [ soap_method ][/align]
[align=left] HRESULT HelloWorld(/*[in]*/ BSTR bstrInput, /*[out, retval]*/ BSTR *bstrOutput)[/align]
[align=left] {[/align]
[align=left] CComBSTR bstrOut(L"Hello ");[/align]
[align=left] bstrOut += bstrInput;[/align]
[align=left] *bstrOutput = bstrOut.Detach();[/align]
[align=left] [/align]
[align=left] SOAP_FAULT(SOAP_E_SERVER, L"Do you love me, my girl");[/align]
[align=left] return E_FAIL;[/align]
[align=left] }[/align]
[align=left][/align]
[align=left][/align]
[align=left]然而,m_fault参数未定义,我们需要把它加入到atlsoap.h文件中。打开atlsoap.h,加入下面的代码,注意红色部分是我加的,其他地方不要改变:[/align]
[align=left][/align]
template <typename THandler>
class CSoapHandler :
public CSoapRootHandler,
public CComObjectRootEx<CComMultiThreadModel>,
public IRequestHandlerImpl<THandler>
{
protected:
HTTP_CODE m_hcErr;
CHttpResponse *m_pHttpResponse;
// heap for SOAP requests
CWin32Heap m_heap;
// default heap is COM heap (SOAP Servers can double as COM objects)
CComHeap m_comHeap;
// CL2: 这里添加成员用来返回用户定制的错误,而不是根据HRESULT值生成错误
CSoapFault m_fault;
public:
BEGIN_COM_MAP(CSoapHandler<THandler>)
COM_INTERFACE_ENTRY(ISAXContentHandler)
COM_INTERFACE_ENTRY(IRequestHandler)
END_COM_MAP()
CSoapHandler()
:m_pHttpResponse(NULL), m_hcErr(HTTP_SUCCESS)
{
SetMemMgr(&m_comHeap);
}
void SetHttpError(HTTP_CODE hcErr)
{
m_hcErr = hcErr;
}
HRESULT SoapFault(
SOAP_ERROR_CODE errCode,
const wchar_t *wszDetail,
int cchDetail)
{
ATLASSUME( m_pHttpResponse != NULL );
SetHttpError(AtlsHttpError(500, SUBERR_NO_PROCESS));
m_pHttpResponse->ClearHeaders();
m_pHttpResponse->ClearContent();
m_pHttpResponse->SetContentType("text/xml");
m_pHttpResponse->SetStatusCode(500);
if (m_fault.m_soapErrCode == SOAP_E_UNK)
{
if (wszDetail != NULL)
{
if (cchDetail < 0)
{
cchDetail = (int) wcslen(wszDetail);
}
_ATLTRY
{
m_fault.m_strDetail.SetString(wszDetail, cchDetail);
}
_ATLCATCHALL()
{
ATLTRACE( _T("CSoapHandler::SoapFault -- out of memory. " ) );
return E_OUTOFMEMORY;
}
}
m_fault.m_soapErrCode = errCode;
}
m_fault.GenerateFault(m_pHttpResponse);
return S_OK;
}
... ...
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left]以上就这些就可以了,运行就看到返回的错误信息“<Detail>Do you love me, my girl</Detail>”。[/align]
[align=left][/align]
[align=left]我使用VS2005+ATL8来写WebService。用其他语言写的WebService不知道存在这些问题不。如果要用好ATL Server,对它的代码做些修改是很正常的。我修改了它很多默认的实现,比如CSessionStateService、CPerfMon等类。[/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
[align=left][/align]
相关文章推荐
- ATLServer WebService 如何返回任意内容的 SOAP 消息给客户 —— 改写atlsoap.h
- 由SOAP消息看Web Service FrameWork的细节差异
- .NET SOAP Web Service client and Borland SOAP server
- 由SOAP消息看Web Service FrameWork的细节差异
- java webservice soap消息请求例子
- Temperature Convert:ATL Server Webservice and Client
- Web应用程序如何应用报表服务来展现报表内容(实例基于SQL Server 2005 Report Service)
- WEB SERVER如何支持CGI/PHP/Perl ___ 程序的核心内容(2)
- 基于SAAJ的Web服务----(三)从SOAP消息中提取内容
- consume an asp.net webservice(upload a file to server) from java via soap
- Web应用程序如何应用报表服务来展现报表内容(实例基于SQL Server 2005 Report Service)
- 由SOAP消息看Web Service FrameWork的细节差异
- Axis Web Service开发之旅 (九) --使用soapmonitor模块监视soap请求与响应消息
- sharepoint 当您尝试通过使用 FrontPage 2003 或当您尝试导出 Web 部件编辑门户收到是类型 Microsoft.SharePoint.SoapServer.SoapServerException " Soap:Server 异常 " 消息
- 由SOAP消息看Web Service FrameWork的细节差异
- 客户端(client)获取服务端(server)返回的SOAP消息包
- 如何解决设置Session保存在StateServer后引起WebService/WebMethod无法异步获取Session
- cxf WebService中如何设定xml中返回值的节点信息
- 当您尝试通过使用 FrontPage 2003 或当您尝试导出 Web 部件编辑门户收到是类型 Microsoft.SharePoint.SoapServer.SoapServerException " Soap:Server 异常 " 消息
- 简单了解SOA/Webservice/SOAP/REST