.NET Call Java WebService Problem

有朋友詢問透過 .NET Call Java 的 WebService ,WSDL定義中,它的回傳值是一個物件的陣列,如下,

public myObj[] getMyObj(string token) {
object[] results = this.Invoke("getMyObj", new object[] {token});
return ((myObj[])(results[0]));
}

可是透過 .NET 去 Call 回傳的物件裡面,屬性卻都是 Null 。

透過 Fiddler 去錄資料確實有傳回來呀 ~~
猜想有可能是在轉成我們的物件時,轉不過來。
於是將 Reference.cs 中轉成程式改成轉成 object[] 的方式,如下,

public object[] getMyObj(string token) {
object[] results = this.Invoke("getMyObj", new object[] {token});
return ((object[])(results[0]));
}

再執行一次程式,裡面就有一堆 xmlNode[] 的資料傳回來,如下,

xmlnodes.png

即然只是無法轉成我們的物件,就自已將 xmlNode[] 透過 Reflection 的方式,轉成我們的物件即如,如下,
var results = new List();
var Lics = ws.getMyObj(t);
foreach (object[] lic in Lics)
{
//lic 是一堆的 xmlNode array
var result = new myObj();
var licArray = lic as XmlNode[];
foreach (var node in licArray)
{
var propName = node.Name;
var propertyInfo = result.GetType().GetProperty(propName);
var pt = Nullable.GetUnderlyingType(propertyInfo.PropertyType) ?? propertyInfo.PropertyType;
object safeValue = (node.InnerText == null) ? null : Convert.ChangeType(node.InnerText, pt);
propertyInfo.SetValue(result, safeValue, null);
}
results.Add(result);
}

註:加入「服務參考」的方式為,
1.「加入服務參考」畫面按最下面的「進階(V)」按鈕
2.「服務參考設定」畫面按最下面的「加入Web參考(W)」按鈕
3.「加入Web參考」畫面,URL(U)欄位輸入 WSDL 的 URL,並按下右邊的箭頭按鈕
4.「加入Web參考」畫面,調整 「Web參考名稱(N)」,並按下「加入參考」按鈕
ws.png

ASP.NET 1.1 @ Chrome Browser Validation Problems

我們有個專案是使用 ASP.NET 1.1 開發的,想讓它也可以運作在 Chrome Browser 上面。
在修改的過程中,居然發現自行定義的驗證機制在 Chrome 中居然不會被 Render 出來。
而要不要將那些驗證機制 Render 出來, ASP.NET 是去看 config 檔中的 browserCaps 設定。
所以就依「WebUIValidation.js在某些IE無法Render出來的解法!」這篇文章的設定方式,讓它的驗證機制可以出來。

雖然驗證機制出來了,但是它並不會啟用驗證機制,因為它會判斷 clientInformation.appName 是否包含 Explorer ,如果不包含就不會去 Call ValidatorOnLoad 這個 Method。

clientInformation所以我們就需要判斷,如果 clientInformation.appName 不包含 Explorer 的話,就需要執行 ValidatorOnLoad 這個 Method (請放在頁面的最下方哦!)。

另外,因為 Server 上的 aspnet_client/system_web/1_1_4322/WebUIValidation.js 有些是在 Chrome 上是無法執行的,也是要調整才行,內容如下,

WebUIValidation.js

希望對大家有幫助。

NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9806)

我們透過 Xamarin.iOS 使用 UIWebView 的方式來載入我們的系統。

最近有一些 iPad 在使用時會出現白白的畫面,沒辦法呈現我們的網頁。

透過 Xamarin Studio 來 Debug 時,會出現以下的錯誤訊息,

NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9806)

在執行 APP 前要先透過客戶的 VPN APP 連上 VPN 之後,我們的 APP 才可以連到我們的網頁。
而我們的網頁也走 https 了,為什麼還會發生那個錯誤呢?

查詢網路上的說明,都說要在 info.plist 中加入 NSAllowsArbitraryLoadsInWebContent 等其他的設定,並設定為 Yes 。 結果還是沒有效。

後來透過 MAC VPN 進去,透過 nscurl 測試一下,

nscurl --ats-diagnostics --verbose https://我們的網址

結果真的出現一堆錯誤,而且結果都是 FAIL ,如下,

Configuring TLS exceptions for


TLSv1.2
ATS Dictionary:
{
NSExceptionDomains = {
“" = {
NSExceptionMinimumTLSVersion = “TLSv1.2″;
};
};
}
Result : FAIL
Error : Error Domain=NSURLErrorDomain Code=-1200 “An SSL error has occurred and a secure connection to the server cannot be made." UserInfo={_kCFStreamErrorCodeKey=-9824, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, NSUnderlyingError=0x7ffda450bd80 {Error Domain=kCFErrorDomainCFNetwork Code=-1200 “(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, _kCFNetworkCFStreamSSLErrorOriginalValue=-9824, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9824}}, NSLocalizedDescription=An SSL error has occurred and a secure connection to the server cannot be made., NSErrorFailingURLKey=https:///eod, NSErrorFailingURLStringKey=https:///eod, _kCFStreamErrorDomainKey=3}

Allowing Arbitrary Loads


Allow All Loads
ATS Dictionary:
{
NSAllowsArbitraryLoads = true;
}
Result : FAIL
Error : Error Domain=NSURLErrorDomain Code=-1202 “The certificate for this server is invalid. You might be connecting to a server that is pretending to be “” which could put your confidential information at risk." UserInfo={NSURLErrorFailingURLPeerTrustErrorKey=, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9813, NSErrorPeerCertificateChainKey=(
“"
), NSUnderlyingError=0x7ffda473b240 {Error Domain=kCFErrorDomainCFNetwork Code=-1202 “(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, kCFStreamPropertySSLPeerTrust=, _kCFNetworkCFStreamSSLErrorOriginalValue=-9813, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9813, kCFStreamPropertySSLPeerCertificates=(
“"

)}}, NSLocalizedDescription=The certificate for this server is invalid. You might be connecting to a server that is pretending to be “” which could put your confidential information at risk., NSErrorFailingURLKey=https:///eod, NSErrorFailingURLStringKey=https:///eod, NSErrorClientCertificateStateKey=0}

顯然客戶 VPN 的憑證 iPad 應該是直接給他退貨 … 呵! 呵!

但奇怪的是,客戶有問題的 iPad 的 iOS 版本為 10.0.1 ,我們用 iPad 的 iOS 版本為 10.3.2 卻沒有這種問題。

透過模擬器來執行不同版本果然是 10.0.1 會出現那個錯誤,而 10.3.2 就不會出現那個問題。

最後建議客戶將 iPad 升級到 10.3.2 ,或是檢視一下 vpn 憑證。

所以如果大家有類似的問題,可以檢查看看是不是 iOS 10.0.1 ,並用 nscurl 指令檢查看看哦!