Я создал простой сервис 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);