2016-01-08 20 views
9

Sto provando a salvare un contenuto canvas html5, su localhost utilizzando un server web. Ricevo il valore del canvas in base64 e lo mando al mio webservice. Ma quando invio dei dati al webservice ottengo questo errore e il file non viene salvato:Invio dell'immagine in base64 a Webservice - 'application/octet-stream' non era il tipo previsto 'text/xml; charset = utf-8 '

415: "Impossibile elaborare il messaggio in quanto il tipo di contenuto 'application/octet-stream' non era il previsto scrivi 'text/xml; charset = utf-8'. "

Cosa sto sbagliando?

Service.vb

Imports System.IO 
Imports System.Drawing 

Public Class Service 
    Implements IService 

    Public Sub New() 
    End Sub 


    Public Function savePictureBase64(bytes As Byte()) As Boolean Implements IService.savePictureBase64 
     Dim fullOutputPath As String = "c:\temp\file.png" 

     'get a temp image from bytes, instead of loading from disk 
     'data:image/gif;base64, 


     Dim imagem As Image 
     Using ms As New MemoryStream(bytes) 
      imagem = Image.FromStream(ms) 
     End Using 

     File.WriteAllBytes(fullOutputPath, (bytes)) 

     Return True 


    End Function 

End Class 

IService.vb

<ServiceContract()> 
Public Interface IService 


    <OperationContract()> 
    Function savePictureBase64(bytes As Byte()) As Boolean 



    ' TODO: Add your service operations here 

End Interface 

Javascript

function save() { 
       var image = document.getElementById("sketchpad").toDataURL("image/png"); 
       image = image.replace('data:image/png;base64,', ''); 
       $.ajax({ 
      type: 'POST', 
      url: 'http://localhost:52193/service.svc', 
      data: image, 
      contentType: 'application/octet-stream', 
       success: function (msg) { 
         alert('Image saved successfully !'); 
       }, 
       error: function(result) { 
        alert("Error"); 
       } 
      }); 
     } 

</script> 

web.config

<?xml version="1.0"?> 
<configuration> 
    <appSettings> 
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true"/> 
    </appSettings> 
    <system.web> 
    <compilation debug="true" strict="false" explicit="true" targetFramework="4.5"/> 
    <httpRuntime targetFramework="4.5"/> 
    <pages> 
     <namespaces> 
     <add namespace="System.Runtime.Serialization"/> 
     <add namespace="System.ServiceModel"/> 
     <add namespace="System.ServiceModel.Web"/> 
     </namespaces> 
    </pages> 
    </system.web> 
    <system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <!-- To avoid disclosing metadata information, set the values below to false before deployment --> 
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> 
      <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <bindings> 
     <basicHttpBinding> 
     <binding messageEncoding="Mtom"> 
     </binding> 
     </basicHttpBinding> 
    </bindings>  
    <protocolMapping> 
     <add binding="basicHttpsBinding" scheme="https"/> 
    </protocolMapping> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/> 
    </system.serviceModel> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    <!-- 
     To browse web app root directory during debugging, set the value below to true. 
     Set to false before deployment to avoid disclosing web app folder information. 
     --> 
    <directoryBrowse enabled="true"/> 
    </system.webServer> 
</configuration> 
+1

correlati: [Errore consumare webservice, tipo di contenuto “application/XOP + xml” non corrisponde al tipo “text/xml” previsto ] (http://stackoverflow.com/questions/10496186/error-consuming-webservice-content-type-application-xopxml-does-not-match-ex). – cybermonkey

+0

Aggiunto a web.config. Ancora non funziona – RSilva

+1

Prova questo: 'data: {bytes: image}' ed elimina la riga 'contentType: 'application/octet-stream'' – Hackerman

risposta

4

L'errore è la chiamata effettuata dal codice Javascript. Si tenta di inviare una stringa, il webservice prevede un messaggio XML:

tipo previsto 'text/xml; charset = utf-8' .

Non so quanto sia complicato comporre un messaggio XML Webservice da JavaScript, ma penso che sia possibile modificare il proprio approccio. Il tuo servizio è ospitato su IIS, puoi costruire un HttpHandler?

public class UploadBase64 : IHttpHandler 
{ 
    public bool IsReusable 
    { 
     get { return true; } 
    } 
    public void ProcessRequest(HttpContext context) 
    { 
     string image_string = string.Empty; 
     using (StreamReader sr = new StreamReader(context.Request.InputStream)) 
      image_string = sr.ReadToEnd(); 
     byte[] image_bin = Convert.FromBase64String(image_string); 
     File.WriteAllBytes(@"c:\temp_10\test01.png", image_bin); 
    } 
} 

... e aggiungere questo al vostro file di web.config:

<system.web> 
    <httpHandlers> 
    <add verb="POST" path="UploadBase64.aspx" type="WebApplication1.UploadBase64"/> 
    </httpHandlers> 
</system.web>