Загрузка текстового файла в службу WCF RESTful - PullRequest
1 голос
/ 09 января 2012

Я создал простой сервис RESTful WCF с одним методом получения файлов и простым клиентом, который загружает файл. Файлы представляют собой простые текстовые файлы (конечно, я хотел бы загрузить двоичные файлы позже).

Служба будет опубликована для многих типов клиентов, поэтому я хотел бы использовать реализацию, которая не добавляет ссылку на службу.

Я правильно это делаю?

Почему я получаю Удаленный сервер возвратил неожиданный ответ: (400) Ошибка неверного запроса при попытке загрузить простой текстовый файл объемом 1 МБ?

Edit: Система работает правильно, если размер моего файла составляет всего 3,7 КБ. Это означает, что мне просто нужно настроить службу для приема больших пакетов. Как мне это сделать?

Услуги:

    /// <summary>
    /// Data Service REST service that handles data upload.
    /// </summary>
    [AspNetCompatibilityRequirements(
    RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
    public class DataService : Common.Contracts.IDataService
    {
        /// <summary>
        /// Uploads a data file to the server.
        /// </summary>
        /// <param name="filename">The filename.</param>
        /// <param name="fileContent">Content of the file.</param>
        public string UploadFile(string filename, Stream fileContent)
        {
            return filename;
        }
    }

Сервисная конфигурация

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    <standardEndpoints>
        <webHttpEndpoint>
            <!--
        Configure the WCF REST service base address 
        via the global.asax.cs file and the default endpoint
        via the attributes on the <standardEndpoint> element below
    -->
            <standardEndpoint name="" helpEnabled="true"
             automaticFormatSelectionEnabled="true"/>
        </webHttpEndpoint>
    </standardEndpoints>
</system.serviceModel>

Контракт:

    /// <summary>
    /// Data Service service contract interface.
    /// </summary>
    [ServiceContract]
    public interface IDataService
    {
        /// <summary>
        /// Uploads a data file to the server.
        /// </summary>
        /// <param name="filename">The filename.</param>
        /// <param name="fileContent">Content of the file.</param>
        [WebInvoke(UriTemplate = "/upload?filename={filename}", 
        Method = "POST", ResponseFormat = WebMessageFormat.Xml)]
        string UploadFile(string filename, System.IO.Stream fileContent);
    }

Клиент

WebChannelFactory<IDataService> cf = 
new WebChannelFactory<IDataService>(
                  new Uri(Settings.Default.UrlService));
IDataService channel = cf.CreateChannel();
StreamReader fileContent = new StreamReader(path, false);

string response = channel.UploadFile(path, fileContent.BaseStream);

Ответы [ 2 ]

1 голос
/ 16 января 2012

Можете ли вы заменить свой стандартный элемент Endpoint следующим:

<standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true" maxBufferSize="500000" maxReceivedMessageSize="500000" >          
          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
            maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />          
        </standardEndpoint>

Надеюсь, это поможет.

0 голосов
/ 12 января 2012

Возможно, это как-то связано с maxReceivedMessageSize, который вы установили в привязках конфигурации.

Получаете ли вы 400, когда загружаете что-то действительно маленькое?

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