Silverlight ネットワーク操作?
WCFによってファイルのアップロードに追加紹介します。
ファイルアップロードするためのデータコンタクトクラスを定義します。
[DataContract] public class UploadFile { [DataMember] public string FileName { get; set; } [DataMember] public byte[] File { get; set; } }
サービス提供する側は下記のように、サービスを定義します。
IService1.svcファイル:
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.Text; namespace FileUploadService { [ServiceContract] public interface IService1 { [OperationContract] void SaveFile(UploadFile UploadFile); } }
Service1.svc.csファイル:
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; using System.Configuration; using System.Web; using System.ServiceModel.Activation; using System.IO; namespace FileUploadService { [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)] public class Service1 : IService1 { public void SaveFile(UploadFile UploadFile) { FileStream FileStream = new FileStream("E:\\FileUpload\\" + UploadFile.FileName, FileMode.Create); FileStream.Write(UploadFile.File, 0, UploadFile.File.Length); FileStream.Close(); FileStream.Dispose(); } } }
Silverlight側下記のようにあるボタンクリックイベント内で「OpenFileDialog」利用して、ファイルデータを取得できます。
private void button1_Click(object sender, RoutedEventArgs e) { OpenFileDialog fileDialog = new OpenFileDialog(); fileDialog.Multiselect = false; fileDialog.Filter = "All Files|*.*"; bool? retval = fileDialog.ShowDialog(); if (retval != null && retval == true) { Stream strm = fileDialog.File.OpenRead(); byte[] Buffer = new byte[strm.Length]; strm.Read(Buffer, 0, (int)strm.Length); strm.Dispose(); strm.Close(); UploadFile file = new UploadFile(); file.FileName = fileDialog.File.Name; file.File = Buffer; Service1Client proxy = new Service1Client(); proxy.SaveFileAsync(file); proxy.SaveFileCompleted += new EventHandler<System.ComponentModel.AsyncCompletedEventArgs>(proxy_SaveFileCompleted);
} } void proxy_SaveFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e) { if (e.Error == null) { txtFileDisplayName.Text = fileDialog.File.Name + "アップロードしました。"; } }
Web.Config中WCFの設定は「SilverLight上WCFサービスの設定?」参照ください。
以上の実装で、実行する時、下記のようなエラーメッセージが発生する可能性があります。メッセージに説明している通りに、「readerQuotas」の「MaxArrayLength」の値を設定すれば解決できます。
メッセージ パラメーター http://locahost/Server1:uploadFile をシリアル化解除しようとしているときにエラーが発生しました。InnerException メッセージは 'オブジェクト 型 UploadFile の のシリアル化を解除しているときにエラーが発生しました。XML データの読み取り中に最大配列長クォータ (16384) を超えました。このクォータを増やすには、XML リーダーの作成時に使用される XmlDictionaryReaderQuotas オブジェクトの MaxArrayLength プロパティを変更してください。' でした。詳細については InnerException を参照してください。 のシリアル化を解除しようとしているときに、フォーマッタから例外がスローされました
設定サンプル:
<bindings> <customBinding> <binding name="Services.customBinding1"> <binaryMessageEncoding maxReadPoolSize="2147483647" maxSessionSize="2147483647" maxWritePoolSize="2147483647"> <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> </binaryMessageEncoding> <httpTransport transferMode="Streamed" keepAliveEnabled="false" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" /> </binding> </customBinding> </bindings>
コメント: