landuochong 发表于 2011-12-21 08:44

soap开发之自定义Authorization的处理

我遇到这个问题,因为是用qt开发,使用了第三方的gsoap进行设计,结果总是连不通服务器,但是去掉这个就正常工作了,所以可以断定是gsoap代码对于Authorization处理部分的代码的问题。于是仔细研究终于有所发现,原来真的没有做处理,只能自己加代码处理<br><br>例如:服务器端设计,<br><span class="code-keyword">using</span> System.Web.Services.Protocols;

<span class="code-keyword">public</span> <span class="code-keyword">class</span> <span class="search-highlight">Auth</span>Header : <span class="search-highlight">Soap</span>Header
{
    <span class="code-keyword">public</span> <span class="code-keyword">string</span> Username;
    <span class="code-keyword">public</span> <span class="code-keyword">string</span> Password;
}<br><br><span><span><p>以下是 SOAP 1.2 请求和响应示例。所显示的<font class="value">占位符</font>需替换为实际值。</p>POST /webservice/service1.asmx HTTP/1.1
Host: www.test.cn
Content-Type: text/xml; charset=utf-8
Content-Length: <font class="value">length</font>
SOAPAction: "http://www.test.cn/GetTest"

&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;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/"&gt;
&lt;soap:Header&gt;
    &lt;AutherHeader xmlns="http://www.test.cn/"&gt;
      &lt;username&gt;<font class="value">string</font>&lt;/username&gt;
      &lt;userpwd&gt;<font class="value">string</font>&lt;/userpwd&gt;
    &lt;/AutherHeader&gt;
&lt;/soap:Header&gt;
&lt;soap:Body&gt;
    &lt;GetSingerAll xmlns="http://www.test.cn/" /&gt;
&lt;/soap:Body&gt;
&lt;/soap:Envelope&gt;             HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: <font class="value">length</font>

&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;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/"&gt;
&lt;soap:Body&gt;
    &lt;GetSingerAllResponse xmlns="http://www.test.cn/"&gt;
      &lt;GetTestResult&gt;<font class="value">string</font>&lt;/GetTestResult&gt;
    &lt;/GetTestResponse&gt;
&lt;/soap:Body&gt;
&lt;/soap:Envelope&gt;<br><br>于是检查soapclient.cpp文件中的soap_call___ns2__GetTest函数,发现调用了<span style="color: rgb(0, 128, 0);">soap_serialize___ns2__GetTest函数<br>再跟进去发现<font color="#000000">,没有处理header,于是在</font></span><span style=" color:#008000;">soap_serialize___ns2__GetTest(soap,</span><span style=" color:#c0c0c0;"> </span><span style=" color:#008000;">&amp;soap_tmp___ns2__GetTest);</span>之后添加
<span style=" color:#c0c0c0;">      </span><span style=" color:#000000;">soap</span><span style=" color:#000000;">-&gt;</span><span style=" color:#800000;">header</span><span style=" color:#000000;">=</span><span style=" color:#000000;">soap_tmp___ns2__GetTest</span><span style=" color:#000000;">.</span><span style=" color:#800000;">ns1__GetTest</span><span style=" color:#000000;">-&gt;</span><span style=" color:#800000;">soap</span><span style=" color:#000000;">-&gt;</span><span style=" color:#800000;">header</span><span style=" color:#000000;">;</span><span style="color: rgb(0, 128, 0);"><br><br><font color="#000000">因为header是在request结构体中带的,调用时<br></font></span><span style=" color:#c0c0c0;">    </span><span style=" color:#808000;">struct</span><span style=" color:#c0c0c0;"> </span><span style=" color:#800080;">soap</span><span style=" color:#c0c0c0;"> </span><span style=" color:#000000;">soap</span><span style=" color:#000000;">;</span>
<span style=" color:#c0c0c0;">    </span>soap_init<span style=" color:#000000;">(&amp;</span><span style=" color:#000000;">soap</span><span style=" color:#000000;">);</span>
<span style=" color:#008000;"></span><span style=" color:#c0c0c0;">    </span><span style=" color:#808000;">struct</span><span style=" color:#c0c0c0;"> </span><span style=" color:#800080;">SOAP_ENV__Header</span><span style=" color:#c0c0c0;"> </span><span style=" color:#000000;">header</span><span style=" color:#000000;">;</span>
<span style=" color:#c0c0c0;">    </span><span style=" color:#800080;">std</span><span style=" color:#000000;">::</span><span style=" color:#800080;">string</span><span style=" color:#c0c0c0;"> </span><span style=" color:#000000;">user</span><span style=" color:#000000;">=</span><span style=" color:#008000;">"test"</span><span style=" color:#000000;">;</span>
<span style=" color:#c0c0c0;">    </span><span style=" color:#800080;">std</span><span style=" color:#000000;">::</span><span style=" color:#800080;">string</span><span style=" color:#c0c0c0;"> </span><span style=" color:#000000;">passwd</span><span style=" color:#000000;">=</span><span style=" color:#008000;">"123456"</span><span style=" color:#000000;">;</span>
<span style=" color:#c0c0c0;">    </span><span style=" color:#000000;">header</span><span style=" color:#000000;">.</span><span style=" color:#800000;">ns1__AutherHeader_</span><span style=" color:#000000;">=</span><span style=" color:#808000;">new</span><span style=" color:#c0c0c0;"> </span><span style=" color:#800080;">ns1__AutherHeader</span><span style=" color:#000000;">;</span>
<span style=" color:#c0c0c0;">    </span><span style=" color:#000000;">header</span><span style=" color:#000000;">.</span><span style=" color:#800000;">ns1__AutherHeader_</span><span style=" color:#000000;">-&gt;</span><span style=" color:#800000;">username</span><span style=" color:#c0c0c0;"> </span><span style=" color:#000000;">=</span><span style=" color:#c0c0c0;"> </span><span style=" color:#000000;">&amp;</span><span style=" color:#000000;">user</span><span style=" color:#000000;">;</span>
<span style=" color:#c0c0c0;">    </span><span style=" color:#000000;">header</span><span style=" color:#000000;">.</span><span style=" color:#800000;">ns1__AutherHeader_</span><span style=" color:#000000;">-&gt;</span><span style=" color:#800000;">userpwd</span><span style=" color:#c0c0c0;"> </span><span style=" color:#000000;">=</span><span style=" color:#c0c0c0;"> </span><span style=" color:#000000;">&amp;</span><span style=" color:#000000;">passwd</span><span style=" color:#000000;">;</span>
<span style=" color:#c0c0c0;">    </span><span style=" color:#000000;">soap</span><span style=" color:#000000;">.</span><span style=" color:#800000;">header</span><span style=" color:#000000;">=</span><span style=" color:#c0c0c0;"> </span><span style=" color:#000000;">&amp;</span><span style=" color:#000000;">header</span><span style=" color:#000000;">;</span><br><span style=" color:#c0c0c0;">    </span><span style=" color:#800080;">_ns1__GetTest</span><span style=" color:#c0c0c0;"> </span><span style=" color:#000000;">*</span><span style=" color:#000000;">quote</span><span style=" color:#c0c0c0;"> </span><span style=" color:#000000;">=</span><span style=" color:#c0c0c0;"> </span><span style=" color:#808000;">new</span><span style=" color:#c0c0c0;"> </span><span style=" color:#800080;">_ns1__GetTest</span><span style=" color:#000000;">;</span>
<span style=" color:#c0c0c0;">    </span><span style=" color:#800080;">_ns1__GetTestResponse</span><span style=" color:#c0c0c0;"> </span><span style=" color:#000000;">*</span><span style=" color:#000000;">response</span><span style=" color:#c0c0c0;"> </span><span style=" color:#000000;">=</span><span style=" color:#c0c0c0;"> </span><span style=" color:#808000;">new</span><span style=" color:#c0c0c0;"> </span><span style=" color:#800080;">_ns1__GetTestResponse</span><span style=" color:#000000;">;</span>
<span style=" color:#c0c0c0;">    </span><span style=" color:#000000;">quote</span><span style=" color:#000000;">-&gt;</span><span style=" color:#800000;">soap</span><span style=" color:#000000;">=&amp;</span><span style=" color:#000000;">soap</span><span style=" color:#000000;">;</span><br><span style=" color:#000000;">    soapObj</span><span style=" color:#000000;">.</span><span style=" font-style:italic; color:#000000;">__ns2__GetTest</span><span style=" color:#000000;">(</span><span style=" color:#000000;">quote</span><span style=" color:#000000;">,</span><span style=" color:#c0c0c0;"> </span><span style=" color:#000000;">response</span><span style=" color:#000000;">);<br><br>就ok了<br></span></span></span>
页: [1]
查看完整版本: soap开发之自定义Authorization的处理