Загрузка файла из silverlight в сервис WCF - PullRequest
2 голосов
/ 21 октября 2010

У меня проблемы с загрузкой (из Silverlight 4) файла wav на сервер (WCF .NET 4).Файл загружается с SL на сервер и записывается на диск.Но загруженный файл изменяется.Два файла (до загрузки и загруженного) имеют одинаковый размер, но разное содержание.И я попробовал загрузку в обычной консольной программе, она отлично работает.Кажется, что WCF что-то сделал при сериализации данных из SL.У кого-нибудь есть идеи, что происходит?

Сервисный код выглядит следующим образом:

[ServiceContract(Namespace = "")]
interface ISoundService
{
    [OperationContract]
    int UploadSound(UploadSoundFile file);
}

public int UploadSound(UploadSoundFile file)
{
    var path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "/" + file.FileName;
    File.WriteAllBytes(path, file.File);
    return 0;
}

[DataContract]
public class UploadSoundFile
{
    [DataMember]
    public string FileName;

    [DataMember]
    public byte[] File;
}

Сервисный конфиг:

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="Service.SoundService.customBinding0" maxReceivedMessageSize="2000000" maxBufferSize="2000000">
                <readerQuotas maxArrayLength="2000000" maxStringContentLength="2000000"/>
            </binding>
        </basicHttpBinding>
    </bindings>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    <services>
        <service behaviorConfiguration="Service.SoundServiceBehavior" name="Service.SoundService">
            <endpoint address="" binding="basicHttpBinding" contract="Service.ISoundService" bindingConfiguration="Service.SoundService.customBinding0"/>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="Service.SoundServiceBehavior">
                <serviceMetadata httpGetEnabled="true"/>
                <serviceDebug includeExceptionDetailInFaults="true"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>

Клиент Silverlight:

private static int uploadSoundOnServer(string fileName, Stream stream)
{
    SoundServiceClient c = new SoundServiceClient();
    byte[] buffer = new byte[stream.Length];
    stream.Read(buffer, 0, checked((int)stream.Length));
    UploadSoundFile file = new UploadSoundFile() { FileName= fileName, File = buffer, };
    c.UploadSoundAsync(file);
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 03 января 2011

если Stream.Read не может прочитать достаточно байтов, он просто не заполнит оставшиеся байты в вашем буфере, оставляя их на их первоначальном значении, «изменяя» ваш файл Read () возвращает количество фактически прочитанных байтов, поэтому cou может сделать следующее, чтобы убедиться, что вы получили все байты: но, конечно, ваш ответ поможет решить вашу проблему, тем не менее, некоторые подсказки для последователей ...

private static int uploadSoundOnServer(string fileName, Stream stream)
{
    SoundServiceClient c = new SoundServiceClient();
    /* Ensure we read from the start again */
    stream.Seek(0, SeekOrigin.Begin);
    int expectedBytes = stream.Length;
    byte[] buffer = new byte[expectedBytes];
    int bytesRead = stream.Read(buffer, 0, checked((int)expectedBytes));
    /* check read bytes count to match expected stream length */
    if (bytesRead < expectedBytes)
    {
        throw new BadBugException("I missed some bytes");
    }
    UploadSoundFile file = new UploadSoundFile() { FileName = fileName, File = buffer, };
    c.UploadSoundAsync(file);
    //TODO: stream.Seek(oldPosition); for the caller
    return 0;
}
0 голосов
/ 26 октября 2010

Я нашел проблему.Это не имеет ничего общего с WCF или SL.Проблема в IO, stream.

В приложении SL позиция потока не была равна 0, потому что она манипулировалась ранее.Так что это работает, когда позиция меняется на 0 до вызова stream.Read (...).Но я все еще задаюсь вопросом, почему он все еще мог прочитать весь поток, даже если позиция не была в 0 раньше (даже я установил длину в (int) stream.Length).Может быть, когда он достигает конца потока, он снова начинает читать с начала?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...