在Windows Azure的Database Service訂閱了一個SQL Azure服務後,一般來說會要求你建立一個管理者的帳號,但通常在設計系統時又不可能把這個帳號就大喇喇的拿來用在AP上面做連線,這時候就需要另外建立一組帳號,並只開放db_datawriter以及db_datareader的權限來做存取。
過去我們很習慣直接在SQL Server Management Studio以UI的方式加一加,設定一些使用者資料配置就可以了,但是連到SQL Azure上時似乎沒辦法提供這樣的模式(至少我現在用windows 2012是不行的)。於是就只好下command來執行了,方法如下:
1. 連線到master database建立一組登入權限
CREATE LOGIN balogin WITH PASSWORD = 'xxxxxxx';
2. 連線到個別的資料庫,並建立使用者,如連到ABC資料庫後再下指令:
CREATE USER businessadvisor FROM LOGIN balogin;
3. 附予該資料庫使用者的權限,以本例來說只開放讀寫的權限。
EXEC sp_addrolemember 'db_datawriter', 'businessadvisor'
EXEC sp_addrolemember 'db_datareader', 'businessadvisor'
以上指令只要改一改有底色的地方就可以了,但要記得執行時資料庫的切換。
完成後只要去再去Management Studio的Security Tag下確認一下user是否建立完成就可以了。
2013年12月6日 星期五
2013年12月2日 星期一
SQL Server2012匯出資料到SQL Azure的好用方法
最近開發好的系統要上Azure了,可是我用的是SQL Server2008,試了很多方法做匯出但老是不順,我試了幾種方式:
1.將原有資料庫schema以指令匯出後,再到SQL Azure上執行。
2.直接用Management Studio做匯入/匯出動作。
3.使用vistual studio的SSDT(SQL Server Database Tool) for visual studio 2012。
以上三個雖然可行,但就是非常不直覺,請教了公司的先進之後,
原來SQL Server2012有非常好用的匯出方式,可以快速的佈署到SQL Azure上。
其步驟如如下:
1.首先先把原有SQL Server2008的資料庫還原一份到SQL Server2012上面。
2.指定Database,並於工作中選取"Export Data-tier Application",將指令以及資料做匯出的動作。
1.將原有資料庫schema以指令匯出後,再到SQL Azure上執行。
2.直接用Management Studio做匯入/匯出動作。
3.使用vistual studio的SSDT(SQL Server Database Tool) for visual studio 2012。
以上三個雖然可行,但就是非常不直覺,請教了公司的先進之後,
原來SQL Server2012有非常好用的匯出方式,可以快速的佈署到SQL Azure上。
其步驟如如下:
1.首先先把原有SQL Server2008的資料庫還原一份到SQL Server2012上面。
2.指定Database,並於工作中選取"Export Data-tier Application",將指令以及資料做匯出的動作。
3.將匯出的bacpac檔匯回SQL Azure資料庫中。
4.確定SQL Azure上是不是已經多了一個資料庫,簡單!完工!
刪除自訂於資料庫,資料表以及欄位中的擴充欄位屬性
最近SQL Server2012匯出資料庫到bacpac file,準備匯入到SQL Azure時,發生以下問題
原來是因為方便讀取各欄位的描述,所以在每個欄位的Extended Properties都訂義了MS_Description屬性,本來想一個個刪,結果發現有這麼一段SP可以一次處理掉,
步驟如下:
Step1:
執行以下執令取得各別刪除Extended Properties的指令
/*Are there any extended properties? Let's take a look*/
select *,OBJECT_NAME(major_id) from sys.extended_properties xp
/*Now let's generate sp_dropextendedproperty statements for all of them.*/
--tables
set nocount on;
select 'EXEC sp_dropextendedproperty
@name = '''+xp.name+'''
,@level0type = ''schema''
,@level0name = ''' + object_schema_name(xp.major_id) + '''
,@level1type = ''table''
,@level1name = ''' + object_name(xp.major_id) + ''''
from sys.extended_properties xp
join sys.tables t on xp.major_id = t.object_id
where xp.class_desc = 'OBJECT_OR_COLUMN'
and xp.minor_id = 0
union
--columns
select 'EXEC sp_dropextendedproperty
@name = '''+sys.extended_properties.name+'''
,@level0type = ''schema''
,@level0name = ''' + object_schema_name(extended_properties.major_id) + '''
,@level1type = ''table''
,@level1name = ''' + object_name(extended_properties.major_id) + '''
,@level2type = ''column''
,@level2name = ''' + columns.name + ''''
from sys.extended_properties
join sys.columns
on columns.object_id = extended_properties.major_id
and columns.column_id = extended_properties.minor_id
where extended_properties.class_desc = 'OBJECT_OR_COLUMN'
and extended_properties.minor_id > 0
union
--check constraints
select 'EXEC sp_dropextendedproperty
@name = '''+xp.name+'''
,@level0type = ''schema''
,@level0name = ''' + object_schema_name(xp.major_id) + '''
,@level1type = ''table''
,@level1name = ''' + object_name(cc.parent_object_id) + '''
,@level2type = ''constraint''
,@level2name = ''' + cc.name + ''''
from sys.extended_properties xp
join sys.check_constraints cc on xp.major_id = cc.object_id
union
--check constraints
select 'EXEC sp_dropextendedproperty
@name = '''+xp.name+'''
,@level0type = ''schema''
,@level0name = ''' + object_schema_name(xp.major_id) + '''
,@level1type = ''table''
,@level1name = ''' + object_name(cc.parent_object_id) + '''
,@level2type = ''constraint''
,@level2name = ''' + cc.name + ''''
from sys.extended_properties xp
join sys.default_constraints cc on xp.major_id = cc.object_id
union
--views
select 'EXEC sp_dropextendedproperty
@name = '''+xp.name+'''
,@level0type = ''schema''
,@level0name = ''' + object_schema_name(xp.major_id) + '''
,@level1type = ''view''
,@level1name = ''' + object_name(xp.major_id) + ''''
from sys.extended_properties xp
join sys.views t on xp.major_id = t.object_id
where xp.class_desc = 'OBJECT_OR_COLUMN'
and xp.minor_id = 0
union
--sprocs
select 'EXEC sp_dropextendedproperty
@name = '''+xp.name+'''
,@level0type = ''schema''
,@level0name = ''' + object_schema_name(xp.major_id) + '''
,@level1type = ''procedure''
,@level1name = ''' + object_name(xp.major_id) + ''''
from sys.extended_properties xp
join sys.procedures t on xp.major_id = t.object_id
where xp.class_desc = 'OBJECT_OR_COLUMN'
and xp.minor_id = 0
union
--FKs
select 'EXEC sp_dropextendedproperty
@name = '''+xp.name+'''
,@level0type = ''schema''
,@level0name = ''' + object_schema_name(xp.major_id) + '''
,@level1type = ''table''
,@level1name = ''' + object_name(cc.parent_object_id) + '''
,@level2type = ''constraint''
,@level2name = ''' + cc.name + ''''
from sys.extended_properties xp
join sys.foreign_keys cc on xp.major_id = cc.object_id
union
--PKs
SELECT
'EXEC sys.sp_dropextendedproperty @level0type = N''SCHEMA'', @level0name = [' + SCH.name + '], @level1type = ''TABLE'', @level1name = [' + TBL.name + '] , @level2type = ''CONSTRAINT'', @level2name = [' + SKC.name + '] ,@name = ''' + REPLACE(CAST(SEP.name AS NVARCHAR(300)),'''','''''') + ''''
FROM sys.tables TBL
INNER JOIN sys.schemas SCH
ON TBL.schema_id = SCH.schema_id
INNER JOIN sys.extended_properties SEP
INNER JOIN sys.key_constraints SKC
ON SEP.major_id = SKC.object_id
ON TBL.object_id = SKC.parent_object_id
WHERE SKC.type_desc = N'PRIMARY_KEY_CONSTRAINT'
union
--Table triggers
SELECT
'EXEC sys.sp_dropextendedproperty @level0type = N''SCHEMA'', @level0name = [' + SCH.name + '], @level1type = ''TABLE'', @level1name = [' + TBL.name + '] , @level2type = ''TRIGGER'', @level2name = [' + TRG.name + '] ,@name = ''' + REPLACE(CAST(SEP.name AS NVARCHAR(300)),'''','''''') + ''''
FROM sys.tables TBL
INNER JOIN sys.triggers TRG
ON TBL.object_id = TRG.parent_id
INNER JOIN sys.extended_properties SEP
ON TRG.object_id = SEP.major_id
INNER JOIN sys.schemas SCH
ON TBL.schema_id = SCH.schema_id
union
--UDF params
SELECT
'EXEC sys.sp_dropextendedproperty @level0type = N''SCHEMA'', @level0name = [' + SCH.name + '], @level1type = ''FUNCTION'', @level1name = [' + OBJ.name + '] , @level2type = ''PARAMETER'', @level2name = [' + PRM.name + '] ,@name = ''' + REPLACE(CAST(SEP.name AS NVARCHAR(300)),'''','''''') + ''''
FROM sys.extended_properties SEP
INNER JOIN sys.objects OBJ
ON SEP.major_id = OBJ.object_id
INNER JOIN sys.schemas SCH
ON OBJ.schema_id = SCH.schema_id
INNER JOIN sys.parameters PRM
ON SEP.major_id = PRM.object_id
AND SEP.minor_id = PRM.parameter_id
WHERE SEP.class_desc = N'PARAMETER'
AND OBJ.type IN ('FN', 'IF', 'TF')
union
--sp params
SELECT
'EXEC sys.sp_dropextendedproperty @level0type = N''SCHEMA'', @level0name = [' + SCH.name + '], @level1type = ''PROCEDURE'', @level1name = [' + SPR.name + '] , @level2type = ''PARAMETER'', @level2name = [' + PRM.name + '] ,@name = ''' + REPLACE(CAST(SEP.name AS NVARCHAR(300)),'''','''''') + ''''
FROM sys.extended_properties SEP
INNER JOIN sys.procedures SPR
ON SEP.major_id = SPR.object_id
INNER JOIN sys.schemas SCH
ON SPR.schema_id = SCH.schema_id
INNER JOIN sys.parameters PRM
ON SEP.major_id = PRM.object_id
AND SEP.minor_id = PRM.parameter_id
WHERE SEP.class_desc = N'PARAMETER'
union
--DB
SELECT
'EXEC sys.sp_dropextendedproperty @name = ''' + REPLACE(CAST(SEP.name AS NVARCHAR(300)),'''','''''') + ''''
FROM sys.extended_properties SEP
WHERE class_desc = N'DATABASE'
union
--schema
SELECT
'EXEC sys.sp_dropextendedproperty @level0type = N''SCHEMA'', @level0name = [' + SCH.name + '] ,@name = ''' + REPLACE(CAST(SEP.name AS NVARCHAR(300)),'''','''''') + ''''
FROM sys.extended_properties SEP
INNER JOIN sys.schemas SCH
ON SEP.major_id = SCH.schema_id
WHERE SEP.class_desc = N'SCHEMA'
union
--DATABASE_FILE
SELECT
'EXEC sys.sp_dropextendedproperty @level0type = N''FILEGROUP'', @level0name = [' + DSP.name + '], @level1type = ''LOGICAL FILE NAME'', @level1name = ' + DBF.name + ' ,@name = ''' + REPLACE(CAST(SEP.name AS NVARCHAR(300)),'''','''''') + ''''
FROM sys.extended_properties SEP
INNER JOIN sys.database_files DBF
ON SEP.major_id = DBF.file_id
INNER JOIN sys.data_spaces DSP
ON DBF.data_space_id = DSP.data_space_id
WHERE SEP.class_desc = N'DATABASE_FILE'
union
--filegroup
SELECT
'EXEC sys.sp_dropextendedproperty @level0type = N''FILEGROUP'', @level0name = [' + DSP.name + '] ,@name = ''' + REPLACE(CAST(SEP.name AS NVARCHAR(300)),'''','''''') + ''''
FROM sys.extended_properties SEP
INNER JOIN sys.data_spaces DSP
ON SEP.major_id = DSP.data_space_id
WHERE DSP.type_desc = 'ROWS_FILEGROUP'
Step2:
執行後產出以下指令時,再一次貼回New Query視窗就可以順利刪除Extended Properties了。
原來是因為方便讀取各欄位的描述,所以在每個欄位的Extended Properties都訂義了MS_Description屬性,本來想一個個刪,結果發現有這麼一段SP可以一次處理掉,
步驟如下:
Step1:
執行以下執令取得各別刪除Extended Properties的指令
/*Are there any extended properties? Let's take a look*/
select *,OBJECT_NAME(major_id) from sys.extended_properties xp
/*Now let's generate sp_dropextendedproperty statements for all of them.*/
--tables
set nocount on;
select 'EXEC sp_dropextendedproperty
@name = '''+xp.name+'''
,@level0type = ''schema''
,@level0name = ''' + object_schema_name(xp.major_id) + '''
,@level1type = ''table''
,@level1name = ''' + object_name(xp.major_id) + ''''
from sys.extended_properties xp
join sys.tables t on xp.major_id = t.object_id
where xp.class_desc = 'OBJECT_OR_COLUMN'
and xp.minor_id = 0
union
--columns
select 'EXEC sp_dropextendedproperty
@name = '''+sys.extended_properties.name+'''
,@level0type = ''schema''
,@level0name = ''' + object_schema_name(extended_properties.major_id) + '''
,@level1type = ''table''
,@level1name = ''' + object_name(extended_properties.major_id) + '''
,@level2type = ''column''
,@level2name = ''' + columns.name + ''''
from sys.extended_properties
join sys.columns
on columns.object_id = extended_properties.major_id
and columns.column_id = extended_properties.minor_id
where extended_properties.class_desc = 'OBJECT_OR_COLUMN'
and extended_properties.minor_id > 0
union
--check constraints
select 'EXEC sp_dropextendedproperty
@name = '''+xp.name+'''
,@level0type = ''schema''
,@level0name = ''' + object_schema_name(xp.major_id) + '''
,@level1type = ''table''
,@level1name = ''' + object_name(cc.parent_object_id) + '''
,@level2type = ''constraint''
,@level2name = ''' + cc.name + ''''
from sys.extended_properties xp
join sys.check_constraints cc on xp.major_id = cc.object_id
union
--check constraints
select 'EXEC sp_dropextendedproperty
@name = '''+xp.name+'''
,@level0type = ''schema''
,@level0name = ''' + object_schema_name(xp.major_id) + '''
,@level1type = ''table''
,@level1name = ''' + object_name(cc.parent_object_id) + '''
,@level2type = ''constraint''
,@level2name = ''' + cc.name + ''''
from sys.extended_properties xp
join sys.default_constraints cc on xp.major_id = cc.object_id
union
--views
select 'EXEC sp_dropextendedproperty
@name = '''+xp.name+'''
,@level0type = ''schema''
,@level0name = ''' + object_schema_name(xp.major_id) + '''
,@level1type = ''view''
,@level1name = ''' + object_name(xp.major_id) + ''''
from sys.extended_properties xp
join sys.views t on xp.major_id = t.object_id
where xp.class_desc = 'OBJECT_OR_COLUMN'
and xp.minor_id = 0
union
--sprocs
select 'EXEC sp_dropextendedproperty
@name = '''+xp.name+'''
,@level0type = ''schema''
,@level0name = ''' + object_schema_name(xp.major_id) + '''
,@level1type = ''procedure''
,@level1name = ''' + object_name(xp.major_id) + ''''
from sys.extended_properties xp
join sys.procedures t on xp.major_id = t.object_id
where xp.class_desc = 'OBJECT_OR_COLUMN'
and xp.minor_id = 0
union
--FKs
select 'EXEC sp_dropextendedproperty
@name = '''+xp.name+'''
,@level0type = ''schema''
,@level0name = ''' + object_schema_name(xp.major_id) + '''
,@level1type = ''table''
,@level1name = ''' + object_name(cc.parent_object_id) + '''
,@level2type = ''constraint''
,@level2name = ''' + cc.name + ''''
from sys.extended_properties xp
join sys.foreign_keys cc on xp.major_id = cc.object_id
union
--PKs
SELECT
'EXEC sys.sp_dropextendedproperty @level0type = N''SCHEMA'', @level0name = [' + SCH.name + '], @level1type = ''TABLE'', @level1name = [' + TBL.name + '] , @level2type = ''CONSTRAINT'', @level2name = [' + SKC.name + '] ,@name = ''' + REPLACE(CAST(SEP.name AS NVARCHAR(300)),'''','''''') + ''''
FROM sys.tables TBL
INNER JOIN sys.schemas SCH
ON TBL.schema_id = SCH.schema_id
INNER JOIN sys.extended_properties SEP
INNER JOIN sys.key_constraints SKC
ON SEP.major_id = SKC.object_id
ON TBL.object_id = SKC.parent_object_id
WHERE SKC.type_desc = N'PRIMARY_KEY_CONSTRAINT'
union
--Table triggers
SELECT
'EXEC sys.sp_dropextendedproperty @level0type = N''SCHEMA'', @level0name = [' + SCH.name + '], @level1type = ''TABLE'', @level1name = [' + TBL.name + '] , @level2type = ''TRIGGER'', @level2name = [' + TRG.name + '] ,@name = ''' + REPLACE(CAST(SEP.name AS NVARCHAR(300)),'''','''''') + ''''
FROM sys.tables TBL
INNER JOIN sys.triggers TRG
ON TBL.object_id = TRG.parent_id
INNER JOIN sys.extended_properties SEP
ON TRG.object_id = SEP.major_id
INNER JOIN sys.schemas SCH
ON TBL.schema_id = SCH.schema_id
union
--UDF params
SELECT
'EXEC sys.sp_dropextendedproperty @level0type = N''SCHEMA'', @level0name = [' + SCH.name + '], @level1type = ''FUNCTION'', @level1name = [' + OBJ.name + '] , @level2type = ''PARAMETER'', @level2name = [' + PRM.name + '] ,@name = ''' + REPLACE(CAST(SEP.name AS NVARCHAR(300)),'''','''''') + ''''
FROM sys.extended_properties SEP
INNER JOIN sys.objects OBJ
ON SEP.major_id = OBJ.object_id
INNER JOIN sys.schemas SCH
ON OBJ.schema_id = SCH.schema_id
INNER JOIN sys.parameters PRM
ON SEP.major_id = PRM.object_id
AND SEP.minor_id = PRM.parameter_id
WHERE SEP.class_desc = N'PARAMETER'
AND OBJ.type IN ('FN', 'IF', 'TF')
union
--sp params
SELECT
'EXEC sys.sp_dropextendedproperty @level0type = N''SCHEMA'', @level0name = [' + SCH.name + '], @level1type = ''PROCEDURE'', @level1name = [' + SPR.name + '] , @level2type = ''PARAMETER'', @level2name = [' + PRM.name + '] ,@name = ''' + REPLACE(CAST(SEP.name AS NVARCHAR(300)),'''','''''') + ''''
FROM sys.extended_properties SEP
INNER JOIN sys.procedures SPR
ON SEP.major_id = SPR.object_id
INNER JOIN sys.schemas SCH
ON SPR.schema_id = SCH.schema_id
INNER JOIN sys.parameters PRM
ON SEP.major_id = PRM.object_id
AND SEP.minor_id = PRM.parameter_id
WHERE SEP.class_desc = N'PARAMETER'
union
--DB
SELECT
'EXEC sys.sp_dropextendedproperty @name = ''' + REPLACE(CAST(SEP.name AS NVARCHAR(300)),'''','''''') + ''''
FROM sys.extended_properties SEP
WHERE class_desc = N'DATABASE'
union
--schema
SELECT
'EXEC sys.sp_dropextendedproperty @level0type = N''SCHEMA'', @level0name = [' + SCH.name + '] ,@name = ''' + REPLACE(CAST(SEP.name AS NVARCHAR(300)),'''','''''') + ''''
FROM sys.extended_properties SEP
INNER JOIN sys.schemas SCH
ON SEP.major_id = SCH.schema_id
WHERE SEP.class_desc = N'SCHEMA'
union
--DATABASE_FILE
SELECT
'EXEC sys.sp_dropextendedproperty @level0type = N''FILEGROUP'', @level0name = [' + DSP.name + '], @level1type = ''LOGICAL FILE NAME'', @level1name = ' + DBF.name + ' ,@name = ''' + REPLACE(CAST(SEP.name AS NVARCHAR(300)),'''','''''') + ''''
FROM sys.extended_properties SEP
INNER JOIN sys.database_files DBF
ON SEP.major_id = DBF.file_id
INNER JOIN sys.data_spaces DSP
ON DBF.data_space_id = DSP.data_space_id
WHERE SEP.class_desc = N'DATABASE_FILE'
union
--filegroup
SELECT
'EXEC sys.sp_dropextendedproperty @level0type = N''FILEGROUP'', @level0name = [' + DSP.name + '] ,@name = ''' + REPLACE(CAST(SEP.name AS NVARCHAR(300)),'''','''''') + ''''
FROM sys.extended_properties SEP
INNER JOIN sys.data_spaces DSP
ON SEP.major_id = DSP.data_space_id
WHERE DSP.type_desc = 'ROWS_FILEGROUP'
Step2:
執行後產出以下指令時,再一次貼回New Query視窗就可以順利刪除Extended Properties了。

2013年10月26日 星期六
SendGrid申請
公司最近開始導入一些專案需要架構在Windows Azure上,
Azure上有三種服務可以建立網站,分別為1)WebSite 2)VM 3)Cloud
我們新專案時做了以下評估:
1.需要用到排程做某一些事,所以WebSite不適合。
2.第二個我們想到VM,但VM雖然可以做到排程,卻要不定期做windows update,而且上面的一些設定什麼或是防毒之類的軟體的都要自己來,擔心有些動作沒有做,所以只好再作罷。
最後只剩下Cloud專案適合了,不過Cloud必須找到合適的發信機制,公司之前已有前輩使用過SendGrid,但公司統一對外又只有一組雲端帳號,所以只好自己申請了。
以下是我申請SendGrid的過程
1.進入到SendGrid網站後,找到"Start sending today for Free!"後就可以開始申請帳號。申請時很重要的是UserName的部分,是未來登入帳號也是收信的帳號。如果是公司開發用的話,建議Email留的是公司所給的那一組email,因為SendGrid的客服驗證身份是會希望你所用的Email就是和申請網站相同Domain。
2.申請完成後會收到一封確認的信,請點選Email中的啟用連結。
3.完成啟用後就,登入到系統中把完整的Profile進行填寫,填寫時愈詳細愈好,如公司的地址,網站,電話等等~最重要的就是Email最好就和網站同一個網域。
4.等都填寫完後以為可以馬上發送Email,這時候發現發送權限其實還沒開通,必須通過SendGrid客服的審核後才可以開始發送。此時可能會收到SendGrid寄來的信件"SendGrid - Account Provisioning Failure",這時候就要針對他所要求的問題進行回答。英文挺容易的,就一項項的回答他們的客服,最重要的是第二個紅色區塊,必須想辦法讓他們可以驗證你的身份,其中第一個最簡單,就是提供他們的網站和申請帳號是同一個Domain。
5.基本上如果Profile那邊填的資料都沒什麼問題,其實SendGrid客服應該很快就會開通,不過我這個豬頭因為把公司的網址少寫了tw,導致他們連不到網站還特別要求我是不是網站有什麼問題,後來就把Profile的設定改好了之後並回他信,很快就開通了。
6.最後審核完成後就會收到開通的信
最後就是利用他們提供的Sample Code拿來套一套,看到底是不是真的通了。發送成功時他就會從Free Account中扣掉一封。
整個申請的感想是SendGrid雖然審核申請時很龜毛,一定要求資料完成,但是客服會很有耐心的幫你一步步確認。
Azure上有三種服務可以建立網站,分別為1)WebSite 2)VM 3)Cloud
我們新專案時做了以下評估:
1.需要用到排程做某一些事,所以WebSite不適合。
2.第二個我們想到VM,但VM雖然可以做到排程,卻要不定期做windows update,而且上面的一些設定什麼或是防毒之類的軟體的都要自己來,擔心有些動作沒有做,所以只好再作罷。
最後只剩下Cloud專案適合了,不過Cloud必須找到合適的發信機制,公司之前已有前輩使用過SendGrid,但公司統一對外又只有一組雲端帳號,所以只好自己申請了。
以下是我申請SendGrid的過程
1.進入到SendGrid網站後,找到"Start sending today for Free!"後就可以開始申請帳號。申請時很重要的是UserName的部分,是未來登入帳號也是收信的帳號。如果是公司開發用的話,建議Email留的是公司所給的那一組email,因為SendGrid的客服驗證身份是會希望你所用的Email就是和申請網站相同Domain。
2.申請完成後會收到一封確認的信,請點選Email中的啟用連結。
3.完成啟用後就,登入到系統中把完整的Profile進行填寫,填寫時愈詳細愈好,如公司的地址,網站,電話等等~最重要的就是Email最好就和網站同一個網域。
4.等都填寫完後以為可以馬上發送Email,這時候發現發送權限其實還沒開通,必須通過SendGrid客服的審核後才可以開始發送。此時可能會收到SendGrid寄來的信件"SendGrid - Account Provisioning Failure",這時候就要針對他所要求的問題進行回答。英文挺容易的,就一項項的回答他們的客服,最重要的是第二個紅色區塊,必須想辦法讓他們可以驗證你的身份,其中第一個最簡單,就是提供他們的網站和申請帳號是同一個Domain。
5.基本上如果Profile那邊填的資料都沒什麼問題,其實SendGrid客服應該很快就會開通,不過我這個豬頭因為把公司的網址少寫了tw,導致他們連不到網站還特別要求我是不是網站有什麼問題,後來就把Profile的設定改好了之後並回他信,很快就開通了。
6.最後審核完成後就會收到開通的信
最後就是利用他們提供的Sample Code拿來套一套,看到底是不是真的通了。發送成功時他就會從Free Account中扣掉一封。
整個申請的感想是SendGrid雖然審核申請時很龜毛,一定要求資料完成,但是客服會很有耐心的幫你一步步確認。
2013年6月6日 星期四
SilverLight連接WCF使用SSL
1.設定Web.Config:
最基本的是wcf的package路徑要設定好,再設定相關走SSL的設定
黃色區塊是一定要注意的地方,其中有個紅底色的https,一定要記得加s才繞的過去SSL
<system.serviceModel>
<services>
<service name="XXX.WebApp.InsuranceService" behaviorConfiguration="asdf">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="httpBinding" contract="XXX.WebApp.IInsuranceService" />
</service>
</services>
<diagnostics>
<endToEndTracing activityTracing="true" messageFlowTracing="true" propagateActivity="true"></endToEndTracing>
</diagnostics>
<bindings>
<basicHttpBinding>
<binding name="httpBinding">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="None" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="asdf">
<serviceMetadata httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="false"/>
</system.serviceModel>
2.Silverlight的config
Security mode要記得設定為TransportCredenialOnly
wcf的網址路徑一定要記得+S
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IInsuranceService" maxBufferSize="2147483647"
maxReceivedMessageSize="2147483647">
<security mode="TransportCredentialOnly" />
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="https://xx.com.tw/xxService.svc"
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IInsuranceService"
contract="ServiceReference.IInsuranceService" name="BasicHttpBinding_IInsuranceService" />
</client>
</system.serviceModel>
</configuration>
最基本的是wcf的package路徑要設定好,再設定相關走SSL的設定
黃色區塊是一定要注意的地方,其中有個紅底色的https,一定要記得加s才繞的過去SSL
<system.serviceModel>
<services>
<service name="XXX.WebApp.InsuranceService" behaviorConfiguration="asdf">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="httpBinding" contract="XXX.WebApp.IInsuranceService" />
</service>
</services>
<diagnostics>
<endToEndTracing activityTracing="true" messageFlowTracing="true" propagateActivity="true"></endToEndTracing>
</diagnostics>
<bindings>
<basicHttpBinding>
<binding name="httpBinding">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="None" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="asdf">
<serviceMetadata httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="false"/>
</system.serviceModel>
2.Silverlight的config
Security mode要記得設定為TransportCredenialOnly
wcf的網址路徑一定要記得+S
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IInsuranceService" maxBufferSize="2147483647"
maxReceivedMessageSize="2147483647">
<security mode="TransportCredentialOnly" />
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="https://xx.com.tw/xxService.svc"
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IInsuranceService"
contract="ServiceReference.IInsuranceService" name="BasicHttpBinding_IInsuranceService" />
</client>
</system.serviceModel>
</configuration>
2013年5月23日 星期四
ASP.NET 半形/全形轉換問題
客戶這邊有一個UTF-8編碼的資料,程式必須將抛出的資料由半型轉全形,
但今天客戶確發現有一個字"咏"居然變"?"
原本我們是這樣寫的:
value = Strings.StrConv(value, VbStrConv.Narrow, 0).Trim();
取得的value不管怎麼改,如編為UTF-8都還是無法顯示,
結果找到charles大大的blog
http://charlesbc.blogspot.tw/2007/03/wq.html之後
試著把LocationID改為中國簡體,結果居然可以了!
雖然我還不知道為什麼,但至少先解決了我的問題,
不知道是不是使用LocationId為0時會把原有的UTF-8編碼改掉。
但今天客戶確發現有一個字"咏"居然變"?"
原本我們是這樣寫的:
value = Strings.StrConv(value, VbStrConv.Narrow, 0).Trim();
取得的value不管怎麼改,如編為UTF-8都還是無法顯示,
結果找到charles大大的blog
http://charlesbc.blogspot.tw/2007/03/wq.html之後
試著把LocationID改為中國簡體,結果居然可以了!
雖然我還不知道為什麼,但至少先解決了我的問題,
不知道是不是使用LocationId為0時會把原有的UTF-8編碼改掉。
2013年5月16日 星期四
SilverLight連接WCF使用Windows驗證
環境: Windows Server 2008 R2
1.伺服器的"驗證"必須將Windows驗證開啟,並關閉匿名驗證。
2.設定Application為"整合式",進入進階段定後將"識別"改為Network Service。
3.設定Web.Config的<system.serviceModel>區塊
<system.serviceModel>
<services>
<service name="MT.WebApp.InsuranceService" behaviorConfiguration="asdf">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="httpBinding" contract="MT.WebApp.IInsuranceService" />
</service>
</services>
<diagnostics>
<endToEndTracing activityTracing="true" messageFlowTracing="true" propagateActivity="true"></endToEndTracing>
</diagnostics>
<bindings>
<basicHttpBinding>
<binding name="httpBinding">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="asdf">
<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="true" />
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="false"/>
</system.serviceModel>
4.設定Silver config檔。
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IInsuranceService" maxBufferSize="2147483647"
maxReceivedMessageSize="2147483647">
<security mode="TransportCredentialOnly" />
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost/WebETOS/InsuranceService.svc"
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IInsuranceService"
contract="ServiceReference.IInsuranceService" name="BasicHttpBinding_IInsuranceService" />
</client>
</system.serviceModel>
</configuration>
1.伺服器的"驗證"必須將Windows驗證開啟,並關閉匿名驗證。
2.設定Application為"整合式",進入進階段定後將"識別"改為Network Service。
3.設定Web.Config的<system.serviceModel>區塊
<system.serviceModel>
<services>
<service name="MT.WebApp.InsuranceService" behaviorConfiguration="asdf">
<endpoint address="" binding="basicHttpBinding" bindingConfiguration="httpBinding" contract="MT.WebApp.IInsuranceService" />
</service>
</services>
<diagnostics>
<endToEndTracing activityTracing="true" messageFlowTracing="true" propagateActivity="true"></endToEndTracing>
</diagnostics>
<bindings>
<basicHttpBinding>
<binding name="httpBinding">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="asdf">
<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="true" />
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="false"/>
</system.serviceModel>
4.設定Silver config檔。
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IInsuranceService" maxBufferSize="2147483647"
maxReceivedMessageSize="2147483647">
<security mode="TransportCredentialOnly" />
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost/WebETOS/InsuranceService.svc"
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IInsuranceService"
contract="ServiceReference.IInsuranceService" name="BasicHttpBinding_IInsuranceService" />
</client>
</system.serviceModel>
</configuration>
訂閱:
文章 (Atom)