我正在使用Sql服務器文件流類型將大型文件存儲在後端。我正在嘗試使用WCf將文件傳輸到客戶端。如何使用SQL文件流式傳輸win32 API並支持WCF流式傳輸
我能夠使用SQLFileStream(API)獲取文件的句柄。然後我嘗試返回這個流。我在客戶端實現了數據分塊以從流中檢索數據。
我可以爲常規文件流和內存流做到這一點。此外,如果我轉換然後sqlfilestream到內存也是可行的。唯一不行的是當我嘗試返回sqlfilestream時。我究竟做錯了什麼。
我已經嘗試nettcpbinding與流啓用和http綁定與MTOM編碼。
這是我的錯誤信息獲取:
Socket連接被中止。這可能是由於處理你的消息或遠程主機超出接收超時的錯誤或底層網絡問題引起的。本地套接字timneout爲00:09:59 ....
這是我的示例代碼
RemoteFileInfo info = new RemoteFileInfo();
info.FileName = "SampleXMLFileService.xml";
string pathName = DataAccess.GetDataSnapshotPath("DataSnapshot1");
SqlConnection connection = DataAccess.GetConnection();
SqlTransaction sqlTransaction = connection.BeginTransaction("SQLSileStreamingTrans");
SqlCommand command = new SqlCommand();
command.Connection = connection;
command.Transaction = sqlTransaction;
command.CommandText = "SELECT GET_FILESTREAM_TRANSACTION_CONTEXT()";
byte[] transcationContext = command.ExecuteScalar() as byte[];
SqlFileStream stream = new SqlFileStream(pathName, transcationContext, FileAccess.Read);
// byte [] bytes = new byte [stream.Length]; // stream.Read(bytes,0,(int)stream.Length);
// Stream reeturnStream = stream; // MemoryStream memoryStream = new MemoryStream(bytes);
info.FileByteStream = stream;
info.Length = info.FileByteStream.Length;
connection.Close();
return info;
[MessageContract]
public class RemoteFileInfo : IDisposable
{
[MessageHeader(MustUnderstand = true)]
public string FileName;
[MessageHeader(MustUnderstand = true)]
public long Length;
[MessageBodyMember(Order = 1)]
public System.IO.Stream FileByteStream;
public void Dispose()
{
if (FileByteStream != null)
{
FileByteStream.Close();
FileByteStream = null;
}
}
}
任何幫助表示讚賞
解決了我的問題!只是爲了讓任何人都不清楚,拔出所有使用WCF流媒體示例的使用語句(以確保正確處理對象),並將它們處理到服務處理函數(實現IDisposable。 – Sam 2013-11-22 14:21:03
此VB.Net示例執行什麼操作你需要 - http://petermeinl.wordpress.com/2012/02/20/managing-blobs-using-sql-server-filestream-via-ef-and-wcf-streaming/,很容易轉換爲C#,因爲我有,如果任何人需要幫助,只需給我發一條消息/評論,因爲我知道服務錯誤可以修復多麼令人沮喪! – Sam 2013-11-22 14:22:16