WCF REST service 400 Bad Request - PullRequest
       7

WCF REST service 400 Bad Request

0 голосов
/ 06 июля 2011

У меня есть WCF RESTful-сервис и Android-клиент.

Сервер отвечает 400, когда я делаю больший запрос. Кажется, у меня есть 65k лимит вопроса, как в здесь или в других миллионах сообщений по той же проблеме.

Однако я не могу исправить это. Вот как выглядит мой web.config

    <system.serviceModel>
    <diagnostics>
      <messageLogging logMalformedMessages="true" logMessagesAtServiceLevel="true"
        logMessagesAtTransportLevel="true" />
    </diagnostics>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    <standardEndpoints>
      <webHttpEndpoint>
        <standardEndpoint name="myEndpoint" helpEnabled="true" automaticFormatSelectionEnabled="true" maxReceivedMessageSize="1000000" />
      </webHttpEndpoint>
    </standardEndpoints>
  </system.serviceModel>

Вот пример кода сервисной функции:

[WebInvoke(UriTemplate = "/trips/{TripId}/inspection", Method = "POST")]
        [Description("Used on mobile devices to submit inspections to server")]
        public void PostTripInspection(string tripId, Inspection inspection)
        {
            return;
        }

Вот код внутри моего веб-проекта, в котором размещается WCF (Global.asax.cs)

private static void RegisterRoutes()
        {
            // Setup URL's for each customer
            using (var cmc = new CoreModelContext())
            {
                foreach (var account in cmc.Accounts.Where(aa => aa.IsActive).ToList())
                {
                    RouteTable.Routes.Add(
                        new ServiceRoute(
                            account.AccountId + "/mobile", new WebServiceHostFactory(), typeof(MobileService)));
                }
            }
        }

Из того, что я понимаю, Java HttpClient не накладывает никаких ограничений, поэтому он на стороне WCF. Любые указатели о том, как решить эту проблему или как перехватить сообщение в WCF?

РЕДАКТИРОВАТЬ 2: Это то, что показывает трассировка. И когда я изменяю стандартEndpoint, это не помогает ...

enter image description here

Ответы [ 2 ]

1 голос
/ 06 июля 2011

Простите, если вы видели эту ссылку ( Подобный вопрос StackOverflow ):

По умолчанию транспорт WCF ограничено отправкой сообщений на 65K. Если Вы хотите отправить больше, вам нужно включить режим потоковой передачи и вам нужно увеличить размер MaxReceivedMessageSize , который там просто как охранник, чтобы предотвратить кого-то убить ваш сервер, загрузив массивный файл.

Итак, вы можете сделать это, используя привязку конфигурация или вы можете сделать это в код. Вот один из способов сделать это в код:

var endpoint = ((HttpEndpoint)host.Description.Endpoints[0]); //Assuming one endpoint
endpoint.TransferMode = TransferMode.Streamed;
endpoint.MaxReceivedMessageSize = 1024 * 1024 * 10;  // Allow files up to 10MB
0 голосов
/ 06 июля 2011

В этом случае вам не нужно использовать потоковую передачу - все, что вам нужно сделать, это увеличить квоту maxReceivedMessageSize в стандартной точке webHttpEndpoint:

<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"
                      maxReceivedMessageSize="1000000"/>
  </webHttpEndpoint>
</standardEndpoints>

Обновить : еслиизменение конфигурации не работает (я не знаю почему), вы можете попробовать увеличить его в коде.Используя фабрику хостов настраиваемых сервисов, вы получаете ссылку на объект конечной точки и можете увеличить квоту там.Код ниже показывает одну такую ​​фабрику (вам нужно обновить код RegisterRoute, чтобы использовать эту новую фабрику):

public class MyWebServiceHostFactory : ServiceHostFactory
{
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {
        return base.CreateServiceHost(serviceType, baseAddresses);
    }

    class MyWebServiceHost : WebServiceHost
    {
        public MyWebServiceHost(Type serviceType, Uri[] baseAddresses)
            : base(serviceType, baseAddresses)
        {
        }
        protected override void OnOpening()
        {
            base.OnOpening();
            foreach (ServiceEndpoint endpoint in this.Description.Endpoints)
            {
                if (!endpoint.IsSystemEndpoint)
                {
                    Binding binding = endpoint.Binding;
                    if (binding is WebHttpBinding)
                    {
                        ((WebHttpBinding)binding).MaxReceivedMessageSize = 1000000;
                    }
                    else
                    {
                        CustomBinding custom = binding as CustomBinding;
                        if (custom == null)
                        {
                            custom = new CustomBinding(binding);
                        }

                        custom.Elements.Find<HttpTransportBindingElement>().MaxReceivedMessageSize = 1000000;
                    }
                }
            }
        }
    }
}
...