2016-01-08 23 views
9

Próbuję zapisać zawartość canvas html5 na localhost za pomocą serwera WWW. Otrzymuję wartość obszaru roboczego w base64 i wysyłam ją do mojego serwisu WWW. Ale kiedy wysłać dane do usługa otrzymuję ten błąd i plik nie jest zapisany:Wysyłanie obrazu w base64 do Webservice - "application/octet-stream" nie był oczekiwanym typem "text/xml; charset = utf-8 '

415: „Nie można przetworzyć wiadomości, ponieważ typ zawartości «application/octet-stream»nie był oczekiwany wpisz 'text/xml; charset = utf-8'. "

Co robię źle?

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

pokrewne: [Błąd zużywa usługa, typ zawartości „application/xml” + XOP nie pasuje do oczekiwanego typu „text/xml” ] (http://stackoverflow.com/questions/10496186/error-consuming-webservice-content-type-application-xopxml-does-not-match-ex). – cybermonkey

+0

Dodano do web.config. Nadal nie działa – RSilva

+1

Spróbuj tego: 'data: {bytes: image}' i usuń linię 'contentType: 'application/octet-stream''' – Hackerman

Odpowiedz

4

Błąd to połączenie wykonane przez kod JavaScript. Próbujesz wysłać ciąg, usługa oczekiwała komunikatu XML:

oczekiwany typ "text/xml; charset = utf-8 '.

Nie wiem, jak skomplikowane jest tworzenie wiadomości XML z usługi webservice z Javascript, ale myślę, że możesz zmienić swoje podejście. Twoja usługa jest hostowana w IIS, czy możesz zbudować 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); 
    } 
} 

... i dodać to do pliku web.config:

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