此狀況出現於 forms authentication。
解法:加入下面的宣告於 web.config
<location path="VSEnterpriseHelper.axd"> <system.web> <authorization> <allow users="?" /> </authorization> </system.web> </location>
此狀況出現於 forms authentication。
解法:加入下面的宣告於 web.config
<location path="VSEnterpriseHelper.axd"> <system.web> <authorization> <allow users="?" /> </authorization> </system.web> </location>
SELECT TOP 20 SUBSTRING(qt.text, (qs.statement_start_offset/2)+1, ((CASE qs.statement_end_offset WHEN -1 THEN DATALENGTH(qt.text) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2)+1), qs.execution_count, qs.total_logical_reads, qs.last_logical_reads,qs.min_logical_reads, qs.max_logical_reads,qs.total_elapsed_time, qs.last_elapsed_time,qs.min_elapsed_time, qs.max_elapsed_time,qs.last_execution_time,qp.query_planFROM sys.dm_exec_query_stats qsCROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qtCROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qpWHERE qt.encrypted=0ORDER BY qs.total_logical_reads DESC此結果依照成本來排序 產生的結果 xml,可儲存成 .sqlplan,再以 management studio 打開,可檢視其 execution plan. 取自 :http://www.microsoft.com/technet/technetmag/issues/2007/11/SQLQuery/default.aspx?loc=zx 之 http://www.microsoft.com/technet/technetmag/issues/2007/11/SQLQuery/default.aspx?pf=true&fig=true&loc=zx
公司內有不同的team,以 asp.net 1.1 與 asp.net 2.0開發程式
一個team只會使用 1.1 來開發,暫時還無法使用 vs2005 來開發程式
一個team 不願再使用 1.1來開發了。真的生產力不好。因此要用 asp.net 2.0 (vs2005) 開發。
問題來了,兩個不同版本的程式,當然需要不同的虛擬目錄。都使用 Forms authetication。
一般來說會使的使用者需要登入兩次。
解法如下:
ASP.NET 2.0 的預設decryption 是AES,而非 asp.net 1.1 的 3DES。為了讓兩者有一致的解密法,要將一些屬性設定成一致
ASP.NET 2.0 的 web.config 而要設定如下。其中,name 與 protection 的值必需與 asp.net 1.1 的一致。
<authentication mode="Forms">
<forms name="VAT" protection="All" loginUrl="login/login.aspx">
</forms>
</authentication>
<authorization>
<deny users="?" />
</authorization>
<machineKey validationKey="F9D1A2D3E1D3E2F7B3D9F90FF3965ABDAC304902" decryptionKey="F9D1A2D3E1D3E2F7B3D9F90FF3965ABDAC304902F8D923AC" validation="SHA1" decryption="3DES" />
ASP.NET 1.1 的 web.config 與上面幾乎要完全相同,不過,不能有 decryption="3DES"的屬性設定。
在使用 VSTS 做壓力測試時,需要設定 storage type 為 SQL
指令如下
cd n:\Program Files\Microsoft Visual Studio 8\Common7\IDESQLCMD /S Sql2005dev2 -U sa -P password -i loadtestresultsrepository.sql
2 執行SQLServer2005_PerformanceDashboard.msi
3 於 SSMS 中執行 C:\Program Files\Microsoft SQL Server\90\Tools\PerformanceDashboard\setup.sql 4 檢視報表:在 database 上按右鍵/Custom Reports,選擇 C:\Program Files\Microsoft SQL Server\90\Tools\PerformanceDashboard 下的 performance_dashboard_main.rdl
5 開始連報表上的連結
我最喜歡 missing indexes 這個了。由 sql server的執行計劃中,找到應該需要的 index。而非每次都要用 profiler 錄製並調整,這樣會對 server 有 impact
之前沒注意到這個功能,一直沒實作日期檢查。真是)(*&^#@!$@$
而且此主題中,也使用了 css
一般的網頁正常,但一些網頁就不行了。
如 showImage.aspx 的網頁,使用 Response.OutputStream 來輸出圖片
程式片斷如下
Stream objOutputStream = Response.OutputStream;
if ((strContentType != null) && (strContentType.Trim().Length !=0))
{
Response.ContentType = strContentType;
}
Response.AddHeader("Content-Disposition", "inline;filename=" + strFilename);
objOutputStream.Write(bytes, 0, bytes.Length);
這樣的程式,在VS2003 是正常的。但在 VS2005開發過後,會出現如下的錯誤。
Using themed css files requires a header control on the page. (e.g. <head runat="server" />)
原來,為了讓 themed css 能發揮作用,網頁的 header 必須 runAt="server" 這樣asp.net 才能動態的塞入css 的link
但像純顯示圖片的網頁,就不適用了。
解法方法如下:
1 顯示圖片的網頁,改用 httpHandler ==>大工程
2 顯示圖片的網頁,改用 ashx ==> 也是大工程
3 將ShowImage.aspx 的主題設為空白!!! <%@Page Theme=""> 就可以了。
前兩個方法其實還好,但是網頁名稱由 ShowImage.aspx 改成 ShowImage.hahah 或 showImage.ashx ,都要使用 find and replace 大法。
第三個方法就很吊詭了,Theme一定要設成空白才行,
設成不存在的theme 會出錯Theme 'hahaha' cannot be found in the application or global theme directories.。 EnableTheming="false" 是沒有用的
真是怪
可於 http://msdn2.microsoft.com/en-US/asp.net/aa336619.aspx 下載。
其功能,相當於使用 aspnet_compiler.exe 及使用 aspnet_merge.exe ,但是有GUI界面。
可惜,我習慣使用 web application project 的模式開發 asp.net。而web deployment projects只適用 web sites
'~/Root/GotoSite.aspx?site=SCIS&winType=2&url=http://www.google.com.tw' is not a valid virtual path.
耶?為什麼? 原來,原因指定SiteMapNode的Url 時,指定的值中有 Colon (:) Asterisk (*) 有這兩個字,就會被認為不合法。 微軟有沒有解呢?有的,見http://support.microsoft.com/kb/932552/en-us?spid=8940&sid=global
要裝hotfix哦!真是麻煩
這個網站http://www.tpc.org/ 是資料庫系統的競技場。
當然,微軟的 SQL Server 2005 並不是champion
由效能來看,前十名,只有一個是微軟的。第一名是 Oracle 10g R2。但是,看它的規格,天哪! 64 顆 CPU。總造價11,987,716 US $,相當於3,9559,4628 NT,近四億新台幣。這是跑車界中鑽石,是全世界最高等級富豪才需要的「身份表徵」。我們平民等級所需要的,是貨真價實的代步用轎車。
如果由價格/效能比來看,前十名有九名是微軟的產品。看看其硬體規格,會發現這才是符合平常百姓家的等級。
有趣的是第一名的Oracle,其價格/效能比,硬是比2,3,4 名更便宜上近兩成。我覺得是Oracle 特意打造出來的成果,在行銷上有好的交待。
由天瓏書局的中文書暢銷排行http://tlsj.tenlong.com.tw/WebModule/TopSale/topSaleDispAction.do?chi=1 ,可以看到目前最流行的,就是 ASP.NET AJAX 了, 前10本內有三本是講 ASP.NET AJAX。
其他,ASP.NET 2.0 有一本。
以前10 名來看各個主題的比例,結果如下
主題 | 比例 (%) |
ASP.NET AJAX | 30 |
ASP.NET | 40 |
AJAX | 40 |
Microsoft 產品 | 50 |
Web | 70 |
台灣的開發人員的習性是:看來不得不用的時候,才會去認真學。因此由前十大中文暢銷書,可以看到一些趨勢。
因此得到一個結論:
台灣市場目前最流行的是做 AJAX 的網站,而使用微軟技術的佔大宗。而市場上的需求,也是建置Web 網站。
怎麼辦呢?查了一下語法,是可以解決的。
語法如下
RESTORE DATABASE [EInvoice] FROM DISK = N'E:\EInvoice.bak' WITH FILE = 1, NOUNLOAD, STATS = 10
, MOVE 'EInvoice2_Log' TO 'E:\DB\EInvoice_log.ldf'
, MOVE 'EInvoice2_Data' TO 'E:\DB\EInvoice_log.mdf'
剛剛看了一篇文章,針對木馬程式做了一些剖析。http://blog.darkthread.net/blogs/darkthreadtw/archive/2007/06/01/816.aspx
結論是,不要以為您沒有開過奇怪的email 附件、沒有下載過好像無害卻是木馬的程式,也沒有執行之。就以為不會中標了。
事實上,只要不了心開了某個網頁,然後攻擊您的作業系統漏洞,就有可能中毒。
也有可能是正常的網站,被植入了一小段javascript,然後您開啟該網站,就暗地裡被開啟到有問題的網頁。
因此,務必將Windows 保持到最新狀態。
同時,也必須更新您的防毒程式病毒特徵碼。最好自行檢查一下。
PS: 不要好奇地去開啟該 blog 中描述的問題網站。一旦開啟,而您的防毒程式沒有動作,您就可能中毒了。當然,沒有防毒程式就更慘了。
實在看不懂,還在MSDTC更改設定。設定老半天,完全不對。
後來,發現只要在scope 中讀取sql2005 的 database 之 table schema,就會發生上述的錯誤。 原來,讀取table schema 是無法交易的。因此,必須將讀取table schema放在TransactionScopeOption.Suppress 中。
程式大意如下:
using (TrsnsactionScope s1 = new TrsnsactionScope()) { UpdateDBOperation1(); Using (TrsnsactionScope s1 = new TrsnsactionScope(TransactionScopeOption.Suppress)) { ReadTableScheam(); //不要加入交易 } UpdateDBOperation2(); }
1 Local transactions in database (eg: SQL server) 2 Local transactions through DB API (eg: ADO.NET) 3 Distributed transactions through Distributed Transaction Coordinator (DTC) 4 Distributed transactions on component level through COM+ (uses DTC) Enterprise Services in the Microsoft .NET Framework 5 Local distributed transactions in ASP.NET and ASMX 6 Microsoft Host Integration Server (HIS) and COM Transactio Integrator for CICS and IMS (COMTI)
[DataMember]
public string Name
{
get { return name; }
set { name = value; }
}
private int customId;
[DataMember]
public int CustomId
{
get { return customId; }
set { customId = value; }
}
}
//Business Component: Server side
public class CustomBC
{
public Customer GetFirstCustomer()
{
Customer c = new Customer(1, "Charles");
return c;
}
}
//Contract interface: Server side, client side 共用
[ServiceContract]
public interface ICustomerService
{
[OperationContract]
Customer GetFirstCustomer();
}
//Contract Implementation: Server side
[ServiceBehavior(Name = "CustomerService", Namespace = "http://TestCustomChannel.ServiceContracts/2007/05")]
public class MathService : TestCustomChannel.ServiceContracts.ICustomerService
{
public TestCustomChannel.BusinessEntities.Customer GetFirstCustomer()
{
CustomBC bc = new CustomBC();
return bc.GetFirstCustomer();
}
}
//Client Side: 引用Contract interface, business entity
ICustomerService proxy = new ChannelFactory< ICustomerService >("BasicHttpBinding_ICustomerService").CreateChannel();
Customer c = proxy.GetFirstCustomer();
//Client Side config
<client>
<endpoint address="http://localhost:4122/TestCustomChannel.Host/CustomerService.svc"
binding="basicHttpBinding"
contract="TestCustomChannel.ServiceContracts.ICustomerService"
name="BasicHttpBinding_ICustomerService"
/>
</client>
當assembly發佈出去之後,會被誰呼叫,真的是不知道。
有時,需要確定只能被自己的程式所呼叫。可以利用檢查stackTrace的方法,得知誰在呼叫
public void WhoIsCallingMe()
{
string allowPublicKeyToken = "12345567890abcdefg";
System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace();
//取得呼叫者的FullName
string caller = st.GetFrame(1).GetMethod().ReflectedType.Assembly.FullName;
System.Text.RegularExpressions.Match m = Regex.Match(caller, "PublicKeyToken=(.{16})");
if ((!m.Success) || (!m.Groups[1].Value.Equals(allowPublicKeyToken)))
throw new System.Security.SecurityException("未知的caller");
}
然後,就完成了。
注意到,MSProjectServerUser, MSProjectUser的密碼,開發/測試環境必須保持與Production 環境相同。另外,WSS與SMTP也可能需要調整,避免誤會。
複雜啊!
第二個方法比較快
請參考 http://wiki.fckeditor.net/Developer%27s_Guide/Integration/ASP.Net, 這裡也有web control 可以拖拉到 web form 上哦。 真是方便
BPEL for Windows Workflow Foundation March CTP
可於此處下載
老闆一直要我看 BPEL 相關的東西,終於有進入點了後來就解決了.
使用WCF ,且使用wsDualHttpBinding 時, 常常Client app 會發生如下的錯誤
System.ServiceModel.AddressAlreadyInUseException: HTTP could not register URL http://+:80/Temporary_Listen_Addresses/c030eb34-4c63-446f-b4d1-0bb7df8c4774/ because TCP port 80 is being used by another application. ---> System.Net.HttpListenerException: 程序無法存取檔案,因為檔案正由另一個程序使用。
這是因為 wsDualHttpBinding 預設也是使用 80 port,而此 port 已被 IIS 的預設網站使用了。
此時,必須在 client app.conifg 設定 clientBaseAddress 為不同的 port
<wsDualHttpBinding>
<binding clientBaseAddress=http://localhost:9865/myClient/ />
是否有收到 Office 2007 所產生的文件,如 docx, xlsx, pptx?而使用 office 2003 的您,是否無法打開此類文件。
這時您可以試著安裝相容套件。
Microsoft Office Word、Excel 及 PowerPoint 2007 檔案格式相容性套件
常看到的範例是將物件序列化到檔案。
但最常需要的卻是序列化到字串。
請參考以下範例。注意要 PlaceOrderRequest 必須是Serializable
private string GetXmlContent(PlaceOrderRequest request)
{
StringWriter writer = new StringWriter();
XmlSerializer xs = new XmlSerializer(typeof(PlaceOrderRequest));
xs.Serialize(writer, request);
return writer.ToString();
}
Microsoft SQL Server 2005 Service Pack 2 又出來了!!
從2005/11/07 到2007/03/06短短的14個月,出了SQL Server 2005, sp1, 到sp2
實在不知道應該罵還是應該讚賞。
今天看到的,忍不住寫了下來。
在典型的 Enterprise system中,current client 的比例為 1%,高負載的也才3%。
換句話說,當設計一個 current user 為 100 個 user 的系統時,其實際的 user 約 10000 人。
微軟在 Ajax 上的努力,已經有正式版出來了。
而且,竟然公佈了 source code!!
微軟真的是愈來愈 open mind 了.
願意研究的,請自行下載。
ASP.NET 2.0 AJAX Extensions 1.0 Source Code
在更新 WCF Server Side 的 config 之後,執行 Client Side app 後,在client side app 出現了下列一段的錯誤訊息
System.ServiceModel.FaultException: The request for security token has invalid or malformed elements.
at System.ServiceModel.Security.SecurityUtils.ThrowIfNegotiationFault(Message message, EndpointAddress target)
at System.ServiceModel.Security.SspiNegotiationTokenProvider.GetNextOutgoingMessageBody(Message incomingMessage, SspiNegotiationTokenProviderState sspiState)
覺得莫明其妙。後來才驚覺,在Client Side 的 config 尚未更新。導致Server Side 要求以 A 方式驗證,而Client Side 仍以 B 驗證方式提出Request。
當然會被當成 malformed element 了。
在vs2005 中update service reference ,更新 config 後即ok
安裝完 Microsoft Visual Studio Code Name "Orcas" - LINQ CTP (May 2006) ,再移除後,發現 VS2005 IDE 的 Refactoring 功能不見了。
這真的很不方便。試了重新設定環境,依然沒效。
最後,上了 google ,找到了方法。
1. Start up RegEdit.exe
2. Open registry key [HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\8.0\Packages\{A066E284-DCAB-11D2-B551-00C04F68D4DB}\SatelliteDLL]
3. Edit the "Path" value and change it from "C:\Program Files\Microsoft Visual Studio 8\VC#\VCSPackages\1033\" to "C:\Program Files\Microsoft Visual Studio 8\VC#\VCSPackages\"
4. Go to C:\Program Files\Microsoft Visual Studio 8\Common7\IDE
5. Run Devenv.exe /Setup
6. Run Devenv.exe /ResetUserData
7. Run Devenv.exe /ResetSettings CSharp
當我想部署VSTO 時,security 一直是很麻煩的事。指令一直記不清楚。…
Since network shares by default only get LocalIntranet permissions, it's relatively common to want to use CasPol to fully trust some shares that you control and know are safe. However, CasPol syntax being what it is, the command to do this isn't immediately obvious. If I wanted to trust everything on the share \\ShawnFa-Srv\Tools, the command:
CasPol.exe -m -ag 1.2 -url file://ShawnFa-Srv/Tools/* FullTrust
Would setup the policy to do what I needed. Lets break down this command:
· -m - modify the machine level of the policy. This is needed, since the machine level is where all of the default policy lives. On NT platforms it's also the default level that CasPol works with, however on Win9x, CasPol will default to the user level, so putting -m in the command line explicitly tells CasPol to use the correct level.
· -ag 1.2 - add a code group under group 1.2. In the default policy, group 1.2 is the LocalIntranet group, so the new code group that we're creating will only be checked if the file comes from the intranet.
· -url file://ShawnFa-Srv/Tools/* - The membership condition for the new code group should be a UrlMembershipCondition, and it should match anything with a URL that starts with file://ShawnFa-Srv/Tools, meaning that any file on the \\ShawnFa-Srv\Tools share will match this code group.
· FullTrust - The permission set to grant assemblies that match the code group. In this case, FullTrust.
Once you know the pattern, it's pretty easy to modify this command line to do slightly different things. For instance, if I want to trust only a specific non-strongly named assembly on my share, I might use
CasPol -m -ag 1.2 -hash SHA1 -file \\ShawnFa-Srv\Tools\CodeCSS\CodeCSS.exe FullTrust
Which will create a hash membership condition that matches the SHA1 hash of the CodeCSS.exe file.
When I install a new build of the runtime, my install script actually ends with two lines that do just this:
CasPol.exe -pp off -m -ag 1.2 -url file://ShawnFa-Srv/Tools/* FullTrust
copy config\security.config config\security.config.default
Which trusts everything coming off of a share on my computer, and then makes a copy of that policy as the new default, so that all future calls to CasPol -all -reset do not remove this modification.
%windir%\Microsoft.NET\Framework\v2.0.50727\caspol -m -ag LocalIntranet_Zone -url "\\SampleSharePointServer\vstodocs\*" FullTrust -n "VSTO Documents"
%windir%\Microsoft.NET\Framework\v2.0.50727\caspol -m -ag LocalIntranet_Zone -url "http://SampleSharePointServer/sitedirectory/*" FullTrust -n "VSTO SharePoint Documents"
一直想試試看 WCF 於 internet 上如何做到 message security 的功能
試了MemberShipAndRoleProvider 這一個 sample
是可以執行的。
但我自己寫了一個來試,卻又一直試不出來。
發生錯誤The X.509 certificate CN=localhost chain building failed. The certificate that was used has a trust chain that cannot be verified. Replace the certificate or change the certificateValidationMode. 撤銷功能無法檢查憑證的撤銷
在比對之下,才發現一個事實。
在MemberShipAndRoleProvider此 sample 下,有個假設,是已執行伺服器端的憑證。但該CA卻不存在。因此,無法達到 Chain trust的功能。
因此,必須將 Client side 的ChainTrust 改成PeerOrChainTrust。而在Client Side 的 Trusted Person 加入該網站的憑證。
因為該 client side 信任該網站的憑證,且certificateVericationMode 設成 PeerOrChainTrust,就會確認是不是受信任的人。是的話,就成功了。
<behaviors>
<endpointBehaviors>
<behavior name="ClientEndPointBehavior">
<clientCredentials>
<serviceCertificate>
<authentication certificateValidationMode="PeerOrChainTrust" />
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>