0

ユーザーがWindowsPhone7クライアント(YouTubeなど)からWCFサービスにビデオを視聴してアップロードできるようにするサービスを実装しようとしています。これで、SilverlightフレームワークのMediaElement実装(同じクラスの.NET実装とはいくつかの違いがあります)を持つクライアントにビデオファイル(.wmv)を送信するサービスの基本的な実装があります。これで、クライアントでビデオをローカルで再生しようとすると、SecurityExceptionwasunhandledエラーが発生します。サービス呼び出しをtry/catchブロックにカプセル化しようとすると、アプリケーションがハングします。コードは次のとおりです。

サーバ側:

 class TransferService: ITransferService
    {
        public FileStream DownloadFile(string filename)
        {
            //string FilePath = Path.Combine(@"c:\Uploads", filename);

            FileStream result = File.Open(@"C:\Uploads\test.wmv", FileMode.Open, FileAccess.Read, FileShare.Read);
            return result;
        }

        public void UploadFile(FileStream request)
        {
            //Not yet implemented
        }
    }

サーバー側(web.config):

    <configuration>

    <system.web>
        <compilation debug="true" targetFramework="4.0" />
        <httpRuntime maxRequestLength="100240" />
    </system.web>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="basicHttp" allowCookies="true"
                 maxReceivedMessageSize="20000000"
                 maxBufferSize="20000000"
                 maxBufferPoolSize="20000000" transferMode="Buffered">
          <readerQuotas maxDepth="200000000"
                        maxArrayLength="200000000"
                        maxStringContentLength="200000000"
                        maxBytesPerRead="200000000"
                        maxNameTableCharCount="200000000"/>
        </binding>
      </basicHttpBinding>
    </bindings>

    <services>
      <service name="VideoService.TransferService" behaviorConfiguration="VideoServiceTypeBehaviors" >
        <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
        <endpoint contract="VideoService.ITransferService" binding="basicHttpBinding" address="basic" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8080/"/>
          </baseAddresses>
        </host>
      </service>
    </services>

        <behaviors>
          <serviceBehaviors>
            <behavior name="VideoServiceTypeBehaviors" >
              <serviceMetadata httpGetEnabled="true" />
            </behavior>
          </serviceBehaviors>
        </behaviors>

  </system.serviceModel>
</configuration>

クライアント側:

    public partial class Page1 : PhoneApplicationPage
        {
            TransferServiceClient sc;
            public Page1()
            {
                InitializeComponent();
                sc = new TransferServiceClient();
                this.Loaded += new RoutedEventHandler(Page_Loaded);
            }
            void Page_Loaded(object sender, RoutedEventArgs e)
            {

                sc.DownloadFileCompleted += new EventHandler<DownloadFileCompletedEventArgs>(sc_DownloadFileCompleted); //I think the problem is here
                sc.DownloadFileAsync("test.wmv");
            }
void sc_DownloadFileCompleted(object sender, DownloadFileCompletedEventArgs e)
        {
            myMediaElement.SetSource(e.Result);
            myMediaElement.Play();
        }

クライアント側(ServiceReference.clientconfig):

<configuration>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_ITransferService" closeTimeout="00:02:00"
          openTimeout="00:02:00" receiveTimeout="00:10:00" sendTimeout="00:02:00"
          maxBufferSize="210005536" maxReceivedMessageSize="210005536"
          textEncoding="utf-8">
          <security mode="None" />
        </binding>
        <binding name="BasicHttpBinding_ITransferService1" maxBufferSize="2147483647"
          maxReceivedMessageSize="2147483647">
          <security mode="None" />
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost:53163/TransferService.svc/basic"
        binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ITransferService1"
        contract="TransferService.ITransferService" name="BasicHttpBinding_ITransferService" />
    </client>
  </system.serviceModel>
</configuration>

どんな助けや洞察も大歓迎です。ありがとう

4

1 に答える 1

0

まず、このコードブロックを正しく使用しようとします。

sc.DownloadFileCompleted + = new EventHandler(sc_DownloadFileCompleted); //問題はここにあると思いますsc.DownloadFileAsync( "test.wmv"); myMediaElement.Play();

非同期ダウンロードプロセスを起動し、それに「ダウンロード完了」コールバックをアタッチしています...非同期呼び出しの後に「myMediaElement.Play」を同期的に呼び出すのはなぜですか?現時点では、ファイルはまだダウンロードされておらず、ファイルがロックされているため(ダウンロードのため)、mediaelementが例外を発生させる可能性があります。

非同期ダウンロードプロセスが終了した後、「sc_DownloadFileCompleted」ハンドラーで「myMediaElement」を呼び出す必要があります。

これが問題であったかどうかを確認してください...

于 2012-08-13T23:41:12.350 に答える