2

I have a Phonegap app and want to send audio files from the application to a WCF REST API. I went through stackoverflow and found a lot of questions with the same requirements.

best approach to design a rest web service with binary data to be consumed from the browser

How do I upload a file with metadata using a REST web service?

Posting a File and Associated Data to a RESTful WebService preferably as JSON

From these, I started using the method of sending the metadata first and then using the record identification and sending the file later. But I must be doing something wrong and cannot get this to work. I have posted my code samples below.

JS

var formData = new FormData('file://beep.wav');
$.ajax({
    type: "PUT",
    url: serviceURL + 'VoiceRecord/' + voicerecordId,
    data: formData,
    headers: {
        'token': securityToken
    },
    contentType: false,
    cache: false,
    processData: false,
    success: onSaveVoiceFileSuccess,
    error: function (xhr, status, error) {
        common.onAjaxError(xhr, status, error, 'wrapper, footer');
    },
    async: false
});

WCF

Contract

[WebInvoke(Method = "PUT",
    RequestFormat = WebMessageFormat.Json,
    ResponseFormat = WebMessageFormat.Json,
    BodyStyle = WebMessageBodyStyle.Wrapped,
    UriTemplate = "VoiceRecord/{voicerecordId}")]
[OperationContract]
void UpdateVoiceRecord(string voicerecordId, Stream stream);

Implementation

public void UpdateVoiceRecord(string voicerecordId, Stream stream)
    {
        try
        {
            log.Info("Update method called.");
            if (Utilities.ValidateToken())
            {
                log.Info("Security validated");
                using (StreamReader s = new StreamReader(stream))
                {
                    log.Info(s.ReadToEnd());
                }
                HttpMultipartParser parser = new HttpMultipartParser(stream, "boundary");
                log.Info("Parser created");

                if (parser.Success)
                {
                    log.Info("Parser success");
                    int result;
                    bool value = int.TryParse(voicerecordId, out result);
                    if (value)
                    {
                        var voicerecord = unitofwork.VoiceRecordRepository.GetByID(result);
                        if (voicerecord != null)
                        {
                            log.Info("Parser file contents" + parser.FileContents);
                            voicerecord.Record = parser.FileContents;
                            unitofwork.VoiceRecordRepository.Update(voicerecord);
                            unitofwork.Commit();
                        }
                    }
                }
            }
            else
            {
                WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.Unauthorized;
            }
        }
        catch (Exception x)
        {
            log.Error(x);
        }
    }

I am using the HttpFormParser to parse the incoming stream. But it is not parsed correctly. I intercepted the stream and only found this string as incoming.

-----------------------------7de23919108a8--

Any help would be appreciated.

Community
  • 1
  • 1
Priyan Perera
  • 530
  • 1
  • 7
  • 19

0 Answers0