2012-10-01 43 views
0

我正在使用PhoneGap的移動應用程序,其中一個功能涉及將圖像上傳到Web服務進行處理。我已經寫了在IIS託管接受圖像的WCF服務,與看起來像合同中的下列:FileTransfer WCF服務接收405

[ServiceContract] 
public interface IImages 
{ 
    [OperationContract(Name="UploadImage")] 
    [WebInvoke(UriTemplate = "?file_key={fileKey}", Method = "POST", BodyStyle = WebMessageBodyStyle.Bare)] 
    ImageResource UploadImage(string fileKey, Stream imageStream); 
} 

在我的web.config配置部分看起來像:

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"> 
     <serviceActivations> 
     <add service="Services.Images" relativeAddress="images.svc" /> 
     </serviceActivations> 
    </serviceHostingEnvironment> 
    <services> 
     <service behaviorConfiguration="DefaultServiceBehavior" name="Services.Images"> 
     <endpoint behaviorConfiguration="DefaultEndpointBehavior" binding="webHttpBinding" bindingConfiguration="PublicStreamBinding" contract="Services.Contracts.IImages" /> 
     </service> 
    </services> 
    <bindings> 
     <webHttpBinding> 
     <binding name="PublicStreamBinding" 
       maxReceivedMessageSize="2000000000" transferMode="Streamed"> 
      <security mode="None" /> 
     </binding> 
     </webHttpBinding> 
    </bindings> 
    <behaviors> 
     <endpointBehaviors> 
     <behavior name="DefaultEndpointBehavior"> 
      <webHttp helpEnabled="true" /> 
     </behavior> 
     </endpointBehaviors> 
     <serviceBehaviors> 
     <behavior name="DefaultServiceBehavior"> 
      <serviceMetadata httpGetEnabled="false" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
      <serviceThrottling maxConcurrentCalls="30" maxConcurrentInstances="30" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 

當我嘗試使用PhoneGap的FileTransfer類將文件上載到端點時,從服務返回的響應是405方法不允許。我在這裏做錯了什麼?

更新:我的移動應用上傳文件的功能如下。指向舊的ASMX服務時,此代碼先前工作正常。

ns.UploadImage = function(){ 
     //alert(ns.Dictionary['LocalImagePath']); 

     var uri = ns.Dictionary['LocalImagePath']; 

     try { 
      var options = new FileUploadOptions(); 

      options.fileKey = uri.substr(uri.lastIndexOf('/')+1) + ".jpeg"; 
      options.fileName = uri.substr(uri.lastIndexOf('/')+1) + ".jpeg"; 
      options.mimeType = "image/jpeg"; 

      var ft = new FileTransfer(); 

      ft.upload(uri, GetServerUrl()+"images.svc?file_key="+options.fileKey, ns.UploadImageSuccess, ns.UploadImageError, options); 

     } catch (e) { 
      ns.UploadImageError(e); 
     } 
    }; 
+0

你能告訴我們你用來上傳文件的代碼嗎? –

+0

當然,我已經使用將文件上傳到服務的功能更新了帖子。 –

回答

0

好吧,所以我想我明白了這一點。很顯然,當這個方法被託管在這樣的根目錄下時,如果你沒有使用'/'跟蹤uri中的服務名稱,請求將無法正確路由。因此,在上傳文件的功能中,我將ft.upload行更改爲以下內容:

ft.upload(uri, GetServerUrl()+"images.svc/?file_key="+options.fileKey, ns.UploadImageSuccess, ns.UploadImageError, options); 

其中有效。

+0

什麼是您正在使用的ImageResource類? –