使用SoapHeader傳遞和驗證使用者

2021-04-16 04:56:28 字數 2418 閱讀 4941

許多的公司都有自己的web服務來支撐自己系統內的運營邏輯,並且是非公開的,那麼如何對自己的web服務進行驗證呢?不可能任何乙個知道你的webservice url 的人都可以去呼叫你的服務,那企業內部那麼多資料豈不全被剽竊?我在這開頭只是言明web服務驗證的重要性,接下來,我將從比較基礎的講起如何使用soapheader來驗證。

首先,我們來講講什麼是soapheader。soap協議是啥我就不好講了,如果讀者還沒有明白soap是啥,那閱讀這篇文章對你沒有用處。soap是由 乙個信封,envelop ,乙個header,乙個body以xml的格式組織而成。請看如下的soap格式,你就明白soap的組成。

<?xml version="1.0" encoding="utf-8"?>

//這個就是soap的信封,也是soap協議的根節點。

這個就是頭了,注意看頭裡面的資訊,下面會提到。

string

//這個就是soap協議的體了。這個是你請求這個web方法所帶進來的引數,入參。並且表明這些引數的性質,如果是列舉,還會挨個列舉出來哦

//這個請求的是search這個web方法,

intboolean

boolean

boolean

boolean

string

string

string

string

string

string

string

string

string

string

好了,經過我的注釋,應該明白什麼是soapheader了吧。下面,還有你成功通過驗證後呼叫了web方法,返回的soap,可以看看。

//返回的時是乙個xml格式的dataset schemaxml

接下來,我們開始在**中如何實現這個soap協議了。

第一步,新建乙個asp.net web服務,建乙個類,這個類要繼承soapheader這個類,並且有個公有的字段,來用作驗證鑰匙。**如下:

public class userauthenticationkey : soapheader

public string key

set

} }

然後,開始寫web方法了。在web方法所在的那個類中,需要使用到繼承那個類的物件,我們使用黑箱復用,在web方法所在類加入乙個他的物件即可實現。還有乙個不要忘記的是在web方法上要標明[soapheader("key")] 這個key就是你要公開去驗證的那個。當然,你的判定可以更加複雜,那是你自己的實現問題了。在我這裡,只要你傳進來的key是"hello"就能驗證通過。

public class myservice : system.web.services.webservice

set

} [webmethod(bufferresponse = true,description = "歡迎方法" ,cacheduration = 0,enablesession=false,

messagename = "hellofriend")]

[soapheader("key")]

public string welcome(string username)

最後,該說說怎麼寫客戶端的呼叫了。這個是非常有學問的了。下面的**,是客戶端建立web服務物件的**,先看,我再解釋。

public static ufaservice createwebserviceinstance()

if ( ufaserviceurl != null && !ufaserviceurl.equals(string.empty) )

userauthenticationkey key = new userauthenticationkey();

key.key = computehash();

//注意這個computhash這個方法,非常重要,

proxy.userauthenticationkeyvalue = key;//還有這個userauthenticationkeyvalue是怎麼來的呢?原來是系統在web物件上新增的這個欄位的值

proxy.credentials = system.net.credentialcache.defaultcredentials;

return proxy;

}這些步驟差不多都比較容易理解,關鍵是如何對欄位進行加密,你可以採用多種方式來定義computhash這個方法來返回這個字串,然後再傳進web服務的時候進行複雜的驗證過程,比如把你機器的ad(active directory)號碼,加上當前的日期,或者加上你的座機**等等,再進行md5加密,再用指定的方法再包裝。。。當然,所有的工作必須要你的web服務端支援才行。

使用 ref 和 out 傳遞陣列

與所有的 out 引數一樣,在使用陣列型別的out引數前必須先為其賦值,即必須由接受方為其賦值。例如 public static void mymethod out int arr 與所有的 ref 引數一樣,陣列型別的ref引數必須由呼叫方明確賦值。因此不需要由接受方明確賦值。可以將陣列型別的re...

值傳遞 和址傳遞

c 關於引數按值傳遞和按址傳遞的,swap為乙個交換函式 交換2個數的值,通常交換值的時候會用到臨時變數,本例中直接通過原有變數進行操作實現了變數的值的交換 code class program b a,b 值傳遞 void swap int a,int b b a,b static void ma...

值傳遞和引用傳遞

幾乎每種語言都有值傳遞和引用傳遞.下面是我的一些曲解,只講現象,不涉及到任何的原理,主要是鬧著玩的.a 新交了個女朋友b.有一天他女朋友b看見a在吃冰激凌,b想吃,但是a是個 座有點小潔癖,不想讓b吃,於是給b買了個新的冰激凌說你吃這個吧,別碰我嘴裡這個.這就是值傳遞.a和b的值沒有任何關係,他們一...