Как использовать ServiceRoutes при определении maxReceivedMessageSize для нестандартных привязок в WCF - PullRequest
3 голосов
/ 03 октября 2011

Редактирование, чтобы переориентироваться на актуальную проблему. Я сохранил оригинальный вопрос в нижней части сообщения, но изменил название и содержание, чтобы отразить то, что действительно происходило.

Мне нужно переопределить maxReceivedMessageSize для службы WCF, добавленной в проект MVC3 через механизм ServiceRoute. Указание привязки в web.config не работает. Как это сделать.


Первоначальный вопрос находится ниже этой линии, но вводит в заблуждение из-за множества ложных срабатываний, которые я видел.

Привет! Я использовал несколько примеров для добавления службы загрузки потокового файла в мой проект MVC3. Если я использую привязки по умолчанию (то есть, не определенные в web.config), служба работает до тех пор, пока я не превышаю размер по умолчанию в 64 КБ. Когда я пытаюсь определить собственную привязку для увеличения размера, я получаю несоответствие типов содержимого в своей трассировке и неподдерживаемый тип носителя HTTP415 в ответе. Я пытаюсь вызвать это через Fiddler через HTTP и не использую клиента WCF. Вот ошибка в след:

Content Type image/jpeg was sent to a service expecting multipart/related;type="application/xop+xml".  The client and service bindings may be mismatched.

Вот раздел модели сервиса web.config

 <system.serviceModel>
<behaviors>
  <endpointBehaviors>
    <behavior name="NewBehavior0" />
  </endpointBehaviors>
</behaviors>
<services>
  <service name="AvyProViewer.FileService">
    <endpoint address="UploadFile" binding="basicHttpBinding" bindingConfiguration=""
      contract="AvyProViewer.FileService"  />
  </service>
</services>

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
<bindings>
  <basicHttpBinding>
    <binding name="NewBinding0" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"
      messageEncoding="Mtom" transferMode="StreamedRequest">
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
        maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
    </binding>
  </basicHttpBinding>
</bindings>

Вот услуга:

[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class FileService
{      
    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "UploadFile")]       
    public string UploadFile(Stream fileStream)       
    {
        string path = HostingEnvironment.MapPath("~");  
        string fileName = Guid.NewGuid().ToString() + ".jpg";
        FileStream fileToupload = new FileStream(path + "\\FileUpload\\" + fileName, FileMode.Create);

        byte[] bytearray = new byte[10000];
        int bytesRead, totalBytesRead = 0;
        do
        {
            bytesRead = fileStream.Read(bytearray, 0, bytearray.Length);
            totalBytesRead += bytesRead;
        } while (bytesRead > 0);

        fileToupload.Write(bytearray, 0, bytearray.Length);
        fileToupload.Close();
        fileToupload.Dispose();
        return fileName;
    }
}

И вот где я раскрываю это в моих маршрутах MVC3:

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.Add(new ServiceRoute("FileService", new WebServiceHostFactory(), typeof(FileService)));
        . . .
}

Ответы [ 2 ]

0 голосов
/ 05 октября 2011

Ответ оказался комбинацией трех разных сообщений переполнения стека. Никто сам по себе не решил вопрос, но каждый дал решающие подсказки относительно того, что происходило.

  1. Похоже, что при добавлении ServiceRoute информация о привязке web.config игнорируется. В этом посте прояснилось, как выглядит недокументированное поведение этой функции: Невозможно установить maxReceivedMessageSize через web.config

  2. Затем я использовал этот пост, чтобы определить, как программно переопределить maxreceivedmesssagesize для привязки: Указание привязки WCF при использовании ServiceRoute .

  3. К сожалению, кодовая форма # 2 не работала "из коробки" (не уверен, изменилось ли поведение привязки для ServiceRoute или в чем разница). Оказывается, если вы укажете ServiceRoute, он автоматически создается как CustomBinding, который не может быть приведен к типу WebHTTPBinding, используемому в # 2. Итак, этот пост: Как программно установить MaxReceivedMessageSize при использовании клиента WCF? помог мне определить, как изменить код в # 2, чтобы добавить эту возможность в пользовательскую привязку.

0 голосов
/ 03 октября 2011

Я думаю, что проблема связана с объявлением mtom для messageEncoding в вашей привязке. Попробуйте изменить MessageEncoding на Text.

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