aspNetCompatibilityEnabled = "истина" - PullRequest
4 голосов
/ 11 сентября 2011

Я создал веб-приложение Azure, в котором есть веб-сайт ASP.NET, который также содержит некоторые службы JSON WCF.Я действительно недостаточно знаю о сервисных моделях WCF, чтобы быть уверенным, что я все делаю правильно, вам это кажется правильным?Существуют ли другие конфигурации модели сервиса, которые лучше подходят для масштабируемости, большего количества одновременных соединений и т. Д.?

      <system.serviceModel>
        <behaviors>
          <serviceBehaviors>
            <behavior name="">
              <serviceMetadata httpGetEnabled="true" />
              <serviceDebug includeExceptionDetailInFaults="true" />
            </behavior>
          </serviceBehaviors>
        </behaviors>
        <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
      </system.serviceModel>
  <system.net>
    <settings>
      <!-- See http://social.msdn.microsoft.com/Forums/en-US/windowsazuredata/thread/d84ba34b-b0e0-4961-a167-bbe7618beb83 -->
      <servicePointManager expect100Continue="false" />
    </settings>
  </system.net>  

Это работает, но я иногда получаю неожиданные потери соединения (тайм-ауты) без кодов ошибок HTTP в моей среде разработки, которыеменя беспокоит.

Обновление @ 24. ноябрь 2011

web.config

  <system.net>
    <connectionManagement>
      <!-- See http://social.msdn.microsoft.com/Forums/en-US/windowsazuredata/thread/d84ba34b-b0e0-4961-a167-bbe7618beb83 -->
      <add address="*" maxconnection="48" />
    </connectionManagement>
  </system.net>  

Я подозреваючто это может быть веб-сервер Visual Studio, который заставляет Ajax-вызовы получать тайм-ауты, через несколько минут сервис снова начинает принимать запросы.Вот моя полная настройка, вы видите, в чем проблема?У меня только один Ajax-вызов в службу.

Inferface

IExample.cs:

using System.ServiceModel;
using System.ServiceModel.Web;

namespace WebPages.Interfaces
{
    [ServiceContract]
    public interface IExample
    {
        [OperationContract]
        [WebInvoke(Method = "GET",
            ResponseFormat = WebMessageFormat.Json)]
        string GetSomething(string id);
    }
}

ExampleService.svc.разметка cs

<%@ ServiceHost Language="C#" Debug="true" Service="WebPages.Interfaces.ExampleService" CodeBehind="ExampleService.svc.cs" Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>

ExampleService.svc.cs codebehind

namespace WebPages.Interfaces
{
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class ExampleService : IExample
    {
        string JsonSerializeSomething(Something something)
        {
            var serializer = new DataContractJsonSerializer(something.GetType());
            var memoryStream = new MemoryStream();

            serializer.WriteObject(memoryStream, something);

            return Encoding.Default.GetString(memoryStream.ToArray());
        }

        public string GetSomething(string id)
        {
            var something = DoSomeBusinessLogic(id);

            return JsonSerializeSomething(something);
        }
    }
}

jQuery вызов от клиента

function _callServiceInterface(id, delegate) {
    var restApiCall = "Interfaces/ExampleService.svc/GetSomething?id="
            + escape(id);

    $.getJSON(restApiCall, delegate);
}

function _getSomethingFromService() {
    _callServiceInterface('123',
        function (result) {
            var parsedResult = $.parseJSON(result);
            $('#info').html(result.SomethingReturnedFromServiceCall);
        }
    );
}

Обновление

Мне кажется, я знаю, в чем проблема сейчас;Похоже, что службы WCF по умолчанию являются однопоточными (источник: http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=EN-US&k=k(SYSTEM.SERVICEMODEL.SERVICEBEHAVIORATTRIBUTE.CONCURRENCYMODE);k(TargetFrameworkMoniker-%22.NETFRAMEWORK%2cVERSION%3dV4.0%22);k(DevLang-CSHARP)&rd=true).Это объясняет, почему мои Ajax-вызовы получают тайм-ауты, они заблокированы другим потоком.Этот код должен работать намного лучше:

ExampleService.svc.cs

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.PerSession,
         IncludeExceptionDetailInFaults = false, MaxItemsInObjectGraph = Int32.MaxValue)]
    //[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class ExampleService : IExample

web.config

 <system.serviceModel>
    <protocolMapping>
      <add scheme="http" binding="webHttpBinding" bindingConfiguration="" />
    </protocolMapping>
    <behaviors>
      <endpointBehaviors>
        <behavior name="">
          <webHttp defaultOutgoingResponseFormat="Json" />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>  

ExampleService.svc

<%@ ServiceHost Language="C#" Debug="true" Service="WebPages.Interfaces.TagService" CodeBehind="TagService.svc.cs" %>

Обновление @ 9. Октябрь 2011

Я думаю, что получил ответ, который мне нужен здесь Блокировка с помощью ConcurrencyMode.Multiple и InstanceContextMode.PerCall

aspNetCompatibilityEnabled="false" означает невозможность доступа к HttpContext, сеансам ASP.NET и т. Д. В моем коде WCF.

1 Ответ

3 голосов
/ 31 июля 2012

Я думаю, что получил ответ, который мне нужен здесь Блокировка с помощью ConcurrencyMode.Multiple и InstanceContextMode.PerCall

aspNetCompatibilityEnabled="false" означает невозможность доступа к HttpContext, сеансам ASP.NET и т. Д. В моем коде WCF.

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