2012-08-13 121 views
0

我想实现一个服务,允许用户观看和上传视频从Windows Phone 7的客户端WCF服务(像YouTube)的。现在,我已经基本实现了将视频文件(.wmv)发送到具有Silverlight框架的MediaElement实现(与同一类的.NET实现有一些区别)的客户端的服务。现在,无论何时我尝试在客户端本地播放视频,我都会遇到SecurityException是未处理的错误。当我尝试在try/catch块中封装服务调用时,应用程序就挂在那里。 下面的代码:Windows Phone 7和WCF视频服务

服务器端:

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> 

任何帮助或洞察力将不胜感激。感谢

回答

0

第一我会尝试使用这个码块正确:

sc.DownloadFileCompleted + =新的EventHandler(sc_DownloadFileCompleted); //我认为问题在这里 sc.DownloadFileAsync(“test.wmv”); myMediaElement.Play();

你火了一个异步下载过程中,你都附加“下载完成” -callback它... 你为什么叫“myMediaElement.Play”后同步异步调用? 在这个时候,该文件还没有下载,也许是MediaElement的火灾例外,因为该文件已被锁定(因为下载的)。

你必须调用“myMediaElement”中的“sc_DownloadFileCompleted” -Handler后异步下载过程完成....

请检查是否这是概率...

+0

我做小在我的应用程序(也在这里)中的代码更改,但它仍然无法正常工作。我已将myMediaElement.Play()方法调用放入DownloadFileCompleted事件的事件处理程序中。没有帮助... – alabroski 2012-08-14 00:00:22