2007年12月5日 星期三

如何讓非本機電腦也可以透過IE測試叫用Web Service

我們在使用VS2005開發完Web Service後,就會把Web Service部署到某台IIS伺服器上,在伺服器本機上,我們可以用IE來測試叫用Web Service的Method。

本機

 

在非本機電腦上叫用Method則會出現"測試表單只適用於來自本機電腦的要求"的訊息

非本機

 

可是有時候,我們就是會有要在非本機測試叫用Web Service的需求,怎麼辦呢?

答案就是改Web.Config

在 <system.web> .... </system.web>區段中加入下面這一段

    <webServices>
        <protocols>
            <add name="HttpGet" />
        <add name="HttpPost" />
        </protocols>
    </webServices>

大功告成!

2007年12月2日 星期日

永遠的Trade-off

Trade-Off

一樣是上星期去上HP Mercury的產品說明會,其中一張投影片的內容,講師說的是要將降低風險到最低,時間、成本會增加;要省成本則風險、時間就會增加;要減短時間則風險、成本會提高。

之前在MCSD的教材看過類似的圖,講的是軟體專案的需求管理,內容大概是如果使用者不斷提出需求,可以畫這張圖給他看,把把Risk換成Requirment,讓他暸解需求太多,專案開發的成本和時程都會大幅增加,藉此和使用者達成Trade-off。

圖是自己用Visio畫的....沒有很漂亮, 看的懂就好!

Test V-Model

測試V-Model

上星期去上HP Mercury的產品說明會,講師提到Test V-Model,講的是最初從一個Idea開始,到最後應用程式安裝到使用者端的一個流程,並標示出系統實際開發前就應該定義出相關的測試內容。

圖是自己用Visio畫的....沒有很漂亮, 看的懂就好!

2007年10月25日 星期四

Oracle啟動Archiving Mode的步驟

1.關閉資料庫
shutdown immediate;

2.啟動資料庫至Mount狀態
startup mount;

3.設定資料庫為Archiving Mode
alter database archivelog;

4.開啟資料庫
alter database open;

5.最後建議作個完整備份

2007年10月9日 星期二

Oracle Connection的Timeout在.NET中要怎麼設??

目前結論是不能設!!不管您是用Oledb或OracleClient都不行!

最近在寫一個Web Service讓廠商叫用,後端資料庫是ORACLE,用Oledb的方式連到資料庫抓資料。

當初規格是開10秒內要回應,昨天下班前廠商說要測試資料庫連不上的情形,所以我就把DB關掉,但是廠商反映Web Service都會超過10秒才回應不符規格要求,我在ConnectionString的後面加上Connect Timeout=5,測試一下!

嗯!!DataAdapter.SelectCommand.Connection.ConnectionTime如願的被改為5了,DataAdapter.Fill()時也會丟出exception,ex.Message怪怪的,什麼叫"多重步驟 OLE DB 操作發生錯誤。請檢查每一個可用的 OLE DB 狀態值",看不太懂...應該沒問題吧!所以我就下班讓廠商慢慢測囉!

今天快中午,廠商又打電話來,說他測完了叫我可以開DB!...咦!我不是一早就開DB了,追蹤程式才發現是只要Connection.Open()就會出這個exception,拿掉連線字串中的Connect Timeout=5就沒問題!所以就改一下讓廠商繼續測其他項目!

Google一下錯誤訊息,在微軟找到答案http://support.microsoft.com/kb/269495/zh-tw 應該是文中所說的但 ADO 連線字串有問題,後來又查了一堆資料,也作了一堆的測試....最後在MSDN文件中找到確定沒解的答案http://msdn2.microsoft.com/en-us/library/system.data.oracleclient.oracleconnection(vs.71).aspx

Note Unlike the Connection object in the other .NET Framework data providers (SQL Server, OLE DB, and ODBC), OracleConnection does not support a ConnectionTimeout property. Setting a connection timeout using a property or in the connection string has no effect and value returned is always zero. OracleConnection also does not support a Database property or a ChangeDatabase method.

微軟這邊沒支援,我想只好再找看看Oracle有沒有什麼方法可以作限制,試了半天改sqlnet.ora的參數names.request_retries、names.initial_retry_timeout、SQLNET.INBOUND_CONNECT_TIMEOUT、SQLNET.RECV_TIMEOUT、SQLNET.RECV_TIMEOUT都試過了都沒效!

明天上班再試試吧....

============2008/03/06 補充=====

時光飛逝,其實隔天我在MSDN就找到解決的方法了,他是一個VB6的範例,印象中他是用Timer去作計時,不過我現在忘記是用什麼關鍵字去搜尋到的,所以沒有辦法附原始範例的連結囉....

既然我們用的是.Net,所以當然不要用Timer這種方式來作,我的解法是用.Net多執行緒的方式來解,範例如下:

Imports System.Data.OracleClient
Public Class frmOracleClient
    Dim StartTime, EndTime As DateTime
    Dim Cn As New OracleConnection

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim th As Threading.Thread
        th = New Threading.Thread(AddressOf CreateConnection)
        Try
            Dim i As Integer = 0
            th.Start()
            '判斷是否另一個執行緒是否執行完畢戓是超過5秒
            While th.ThreadState <> Threading.ThreadState.Stopped And i < 5  
            i = DateDiff(DateInterval.Second, StartTime, Now)
            End While
            If th.ThreadState = Threading.ThreadState.Running Then
                th.Abort()
            End If
        Catch ex As Exception

        End Try
        MessageBox.Show("Stop")

    End Sub

    Private Sub CreateConnection()
        Try
            Cn.ConnectionString = "Data Source=Your_DB_Name;User ID=Your_ID;Password=Your_Password"
            StartTime = Now
            Cn.Open()
        Catch ex As Exception
            EndTime = Now
            MessageBox.Show(ex.Message & vbCrLf & _
                        "StartTime : " & StartTime.ToString & vbCrLf & _
                        "EndTime : " & EndTime.ToString)
        End Try

    End Sub
End Class

2007年8月15日 星期三

讓非本機也可以測試叫用.NET Web Service

用.NET開發的Web Service,預設的設定是只有本機可以用瀏覽器作測試叫用,但是我們會用Web Service一定是用在不同平台、技術的整合上,所以在開發期間能讓別人作測試叫用,對我們開發人員而言是相當需要的功能。

廢話半天,那要怎麼作才能讓非本機也可以測試叫用.NET Web Service呢?說破不值錢,答案就在Web.config裡面。

<system.web>
......
......
</system.web>
的中間加入
<webServices>
<protocols>
<add name="HttpGet" />
<add name="HttpPost" />
</protocols>
</webServices>