2008年2月22日 星期五

db_owner 與 database owner

到今天才發現 db_owner 與 database owner 是不一樣的。 當權限設計的比較複雜時,一般人就沒有 sysadmin 的權限了。 今天有個 database 名為 myDB。為了工作方便,加入 Acc1到該資料庫的 db_owner 角色。 這樣,Acc1可以作很多事情,但就是不能 restore database 查MSDN,發現誰可以 restore database 呢? 必須有 server level 之 sysadmin 或 dbcreater的角色。或者剛好是該 database 之 database owner. 這才發現 db_owner 與 database owner 是不一樣的。

2008年2月20日 星期三

fire stored procedure and forget

程式撰寫時,有時需要在 aspx 上執行 stored procedure。 但有個 stored procedure 要執行很久,且使用者不太想等太久。那怎辦?

Ado.net 好像沒有一個 ExecuteNoneQueryWithoutWaiting 的指令哦!

�好,SQL Server 2005 有一些功能。

建立一個Job,讓�Job 跑此stored procedure做為第一個 step。 再以 ado.net 執行此 stored procedure 即可。

EXEC msdb.dbo.sp_start_job @job_name = 'JobName'

2008年2月15日 星期五

Could not find a base address that matches scheme https for the endpoint with binding WSHttpBinding. Registered base address schemes are [http]

使用wcf的過程中,一直出現Could not find a base address that matches scheme https for the endpoint with binding WSHttpBinding. Registered base address schemes are [http]. 的錯誤。

奇怪的是,我是使用 http://localhost/service/service.svc 來測試的,為何一直有 https 的出現呢?

設定如下:

<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WindowsBinding">
<security mode="Transport">
<transport clientCredentialType="Windows" proxyCredentialType="Windows" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="IssueTracking.IssueServiceBehavior">
<serviceMetadata httpGetEnabled="true"
httpsGetEnabled="false" />
<serviceDebug includeExceptionDetailInFaults="false" />
<serviceCredentials>
<windowsAuthentication includeWindowsGroups="true" allowAnonymousLogons="false" />
</serviceCredentials>
<serviceAuthorization />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="IssueTracking.IssueServiceBehavior"
name="IssueTracking.IssueService">
<endpoint address="" binding="wsHttpBinding" bindingConfiguration="WindowsBinding"
contract="IssueTracking.IIssueService" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
</system.serviceModel>

後來,google 了很久,才漸漸覺的,這是微軟的設計。因為 web service 是不安全的,因此會要求走 SSL。

因此,改走 basciHttpBinding ,並改成<security mode="TransportCredentialOnly">


<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="basicBinding">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" proxyCredentialType="Windows" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="IssueTracking.IssueServiceBehavior">
<serviceMetadata httpGetEnabled="true"
httpsGetEnabled="false" />
<serviceDebug includeExceptionDetailInFaults="false" />
<serviceCredentials>
<windowsAuthentication includeWindowsGroups="true" allowAnonymousLogons="false" />
</serviceCredentials>
<serviceAuthorization />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="IssueTracking.IssueServiceBehavior"
name="IssueTracking.IssueService">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicBinding"
contract="IssueTracking.IIssueService" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
</system.serviceModel>

就ok 了

Security settings for this service require 'Anonymous' Authentication but it is not enabled for the IIS application that hosts this service.

開發 WCF 的程式時,一直出現 Security settings for this service require 'Anonymous' Authentication but it is not enabled for the IIS application that hosts this service.的錯誤。 目的:使用 windows authentication, 讓 intranet user 使用 windows 帳號來使用服務。 http://localhost/myservice 也是我的asp.net 2.0 網站 service url : http://localhost/myservice/service.svc 最後,在 IIS 將 service.svc 設成可以anoymous 存取,就解決了問題

2008年2月14日 星期四

IIS 7.0 上的 Windows Authentication

開發時,一直無法使用 Windows Authentication 再加上 IIS 7.0 的操作介面還不熟。找了許久 原來,預設是不啟用的。 到 Programs and Features\Turn Windows Feathures on and off 到 IIS\Word Wild Web Services\Sercurity 將Windows Authentication勾選 再按 OK即可

HTTP Error 404.3 - Not Found

在使用 WCF 時,Service.svc出現了 如下的錯誤訊息

Server Error in Application "Default Web Site/IssueTracking"

--------------------------------------------------------------------------------

HTTP Error 404.3 - Not Found
Description: The page you are requesting cannot be served because of the Multipurpose Internet Mail Extensions (MIME) map policy that is configured on the Web server. The page you requested has a file name extension that is not recognized, and is not allowed.

Error Code: 0x80070032

Notification: ExecuteRequestHandler

Module: StaticFileModule

Requested URL: http://localhost:80/IssueTracking/IssueService.svc


Physical Path: C:\Users\charles.BANKPRO\Documents\Visual Studio 2008\Projects\IssueTracking\IssueTracking\IssueService.svc

Logon User: Anonymous

Logon Method: Anonymous

Handler: StaticFile

Most likely causes:


原因是我在安裝Vista時,尚未安裝 IIS 7.0,就先裝了 VS2008。因此,得必須自己手動註冊資訊。
除了 aspnet_regiis -i 外 (for asp.net 2.0)
也必須到
c:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation>ServiceModelReg -i

2008年2月5日 星期二

自訂 AutoCompleteExtender







使用 AutoCompleteExtender時,如果要像Google Search 之 tips 效果,要怎麼做呢?

重點是,預設之AutoCompleteExtender,會將所有的 text,全部設定到 textbox 上。

找AutoCompleteExtender 之 AutoCompleteBehavior.js 可以找到下面這一段。

_setText: function(text) { this._timer.set_enabled(false);
this._currentPrefix = text;
var element = this.get_element();
var control = element.control;
// todo: should check for 'derives from' too and should somehow manually cause TB to raise property changed event
if (control && control.set_text)
{
control.set_text(text);
}
else { element.value = text; }
this._hideCompletionList();
},

可以發現,是有機會 override set_text 的。

google 一下後,找到了 solution

function pageLoad() {
AjaxControlToolkit.AutoCompleteBehavior.prototype._setText = function(item) {
var text = item.split(" ")[0];
this.get_element().value = text;
}
}

此會將找到的字串之第一段空白前的文字,塞到 textbox 中。

Share with Facebook