Po pierwsze, jestem nowy zarówno dla usług WCF, jak i dla JS Dropzone, ale próbuję połączyć te dwa, aby utworzyć prosty program do przesyłania obrazów. Mam poprawnie działający moduł WCF dla metadanych, które do niego przesłałem (więc wiem, że przekazuje on poprawnie krzyżową domenę), ale Strumień przechwycony przez Dropzone nie pasuje do obrazu, który upuściłem . Rzeczywiście, każdy pojedynczy zrzut obrazu skutkuje tym samym zakodowanym ciągiem po stronie serwera ...Dropzone JS Przesyłanie do WCF Nieprawidłowe dane
Na przykład użyłem tego star image jako testu, a przesyłając obraz do base64 online converter, widzę, że początku łańcucha base64 wygląda następująco:
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOYAAADbCAMAAABOUB36AAAAwFBMVEX...
jednak, kiedy debugowania mojego kodu WCF, że base64 konwertowane ciąg wygląda następująco:
LS0tLS0tV2ViS2l0Rm9ybUJvdW5kYXJ5T1RUV0I1RFZZdTVlM2NTNQ0KQ29udG...
ciąg powyżej jest taka sama dla utworzona na zawsze y obraz, który próbuję wysłać.
Tak więc dla wszystkich odpowiednich części kodu. Mam prostą stronę w jednym projekcie i pliki powiązane z WCF w innym projekcie w tym samym rozwiązaniu.
Index.html:
<div class="col-lg-12">
<form action="http://localhost:39194/ImageRESTService.svc/AddImageStream/"
class="dropzone"
id="dropzone"></form>
</div>
...
Dropzone.options.dropzone = {
maxFilesize: 10, // MB
};
OperationContract:
/* Stores a new image in the repository */
[OperationContract]
[WebInvoke(Method = "POST",
ResponseFormat = WebMessageFormat.Json,
UriTemplate = "AddImageStream/")]
void AddImageStream(Stream img);
realizacja AddImageStream:
public void AddImageStream(Stream img)
{
//try to save image to database
byte[] buffer = new byte[10000];
int bytesRead, totalBytesRead = 0;
string encodedData = "";
do
{
bytesRead = img.Read(buffer, 0, buffer.Length);
encodedData = encodedData + Convert.ToBase64String(buffer,
Base64FormattingOptions.InsertLineBreaks);
totalBytesRead += bytesRead;
} while (bytesRead > 0);
}
webconfig obowiązujące sztuk:
<services>
<service name="ImageRESTService.ImageRESTService" behaviorConfiguration="serviceBehavior">
<endpoint address="" behaviorConfiguration="web" contract="ImageRESTService.IImageRESTService" binding="webHttpBinding" bindingConfiguration="webHttpBinding"></endpoint>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="serviceBehavior">
<serviceMetadata httpGetEnabled="false" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="web">
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
<standardEndpoints>
<webHttpEndpoint>
<standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true" maxReceivedMessageSize="2147000000" />
</webHttpEndpoint>
</standardEndpoints>
<bindings>
<webHttpBinding>
<binding crossDomainScriptAccessEnabled="true" name="ImagesBinding" closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" />
<binding name="webHttpBinding" transferMode="Streamed" maxReceivedMessageSize="2147483647" maxBufferSize="10485760" closeTimeout="00:01:00" openTimeout="00:01:00"
receiveTimeout="00:10:00" sendTimeout="00:01:00">
<readerQuotas maxStringContentLength="2147483647" maxArrayLength="1000000" />
</binding>
</webHttpBinding>
Problem jest widoczny po złamaniu elementu encodedString i nie jest zgodny z oczekiwanym. Jeśli skopiuję cały ciąg do innego obrazu online, który generuje obrazy ze stringów base64, nie jest to poprawny obraz. W tym momencie utknąłem i nie byłem w stanie określić, dlaczego nie mogę odczytać z dropzone.
Wystarczy sprawdzić, jakie dane wysyła przeglądarka i będzie widać, czy jest problemem klienta lub serwera. – Jehy
Chrome pokazuje poprawny ciąg reprezentujący jpeg przesyłany na karcie sieci. Podział usługi WCF na zmienną encodedData pokazuje ten sam ciąg dla każdego obrazu. Nie jest to pierwsza zmienna serveride, prawdopodobnie powinienem sprawdzić wartość zmiennej Stream dla funkcji AddImageStream, ale nie jestem pewien, jak wyświetlić tam wartość. – Daniel