2010-07-22 1 views
1

У меня есть пользовательский элемент управления Silverlight 4, который вызывает службу WCF, находящуюся в веб-приложении ASP.NET 4.Служба WCF возвращает HTTP 200 заголовок, а затем отключается без возврата какого-либо контента

Анонимный доступ к веб-сервису включен. clientaccesspolicy.xml находится на месте и успешно загружается. Навигация на FieldITDbService.svc на сервере корректно вызывает метаданные службы.

Однако, когда я пытаюсь просмотреть тестовую страницу для Silverlight управления, который вызывает эту службу WCF, сама служба возвращает:

HTTP/1.1 200 OK 
Date: Thu, 22 Jul 2010 21:15:54 GMT 
Server: Microsoft-IIS/6.0 
X-Powered-By: ASP.NET 
X-AspNet-Version: 4.0.30319 
Content-Encoding: gzip 
Content-Length: 4409 
Cache-Control: private 
Content-Type: application/soap+msbin1 

, а затем раз без возврата данных. Я сбит с толку. Кто-нибудь знает, почему это произойдет или как я могу более эффективно отлаживать его? Я отслеживаю трассировку службы, но ошибок в журнале нет - в соответствии с журналом она работает.

Вот ссылка показывает, что происходит (с Fiddler2): http://imgur.com/VwgqS.png

Вот код в MainPage.xaml.cs, который вызывает WebService:

var webService = new FieldITDbServiceClient(); 
webService.ReadVAMDataCompleted += webService_ReadVAMDataCompleted; 
webService.ReadVAMDataAsync(); 
webService.CloseAsync(); 

Вот ClientConfig в проекте Silverlight используется для вызова веб-сервиса:

<system.serviceModel> 
    <bindings> 
     <customBinding> 
      <binding name="CustomBinding_FieldITDbService"> 
       <binaryMessageEncoding /> 
       <httpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" /> 
      </binding> 
     </customBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://[ipofmyserverhere]/FieldIT/FieldITDBService.svc" 
      binding="customBinding" bindingConfiguration="CustomBinding_FieldITDbService" 
      contract="DbServiceRef.FieldITDbService" name="CustomBinding_FieldITDbService" /> 
    </client> 
</system.serviceModel> 

Вот код в действительную службу WCF, FieldITDbService.svc:

[ServiceContract(Namespace = "")] 
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)] 
    public class FieldITDbService 
    { 
     [OperationContract] 
     public List<VAM> ReadVAMData() 
     { 
      List<VAM> allData = new List<VAM>(); 
      using(FieldITEntities dbContext = new FieldITEntities()) 
      { 
       allData.AddRange(dbContext.VAMs.ToList()); 
      } 
      return allData; 
     } 
    } 

Вот раздел ServiceModel в веб-приложений файл web.config:

<system.serviceModel> 
    <diagnostics> 
     <messageLogging maxMessagesToLog="100" 
      logEntireMessage="true" 
      logMessagesAtServiceLevel="true" 
      logMalformedMessages="true" 
      logMessagesAtTransportLevel="true"> 
     </messageLogging> 
    </diagnostics> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name=""> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <bindings> 
     <customBinding> 
     <binding name="FieldIT.FieldITDbService.customBinding0"> 
      <binaryMessageEncoding /> 
      <httpTransport /> 
     </binding> 
     </customBinding> 
    </bindings> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" 
     multipleSiteBindingsEnabled="true" /> 
    <services> 
     <service name="FieldIT.FieldITDbService"> 
     <endpoint address="" binding="customBinding" bindingConfiguration="FieldIT.FieldITDbService.customBinding0" 
      contract="FieldIT.FieldITDbService" /> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     </service> 
    </services> 
    </system.serviceModel> 
+1

ли это все еще может случиться, если вы закомментировать 'CloseAsync'? Это просто выглядит неправильно для меня, почему бы вам позвонить по объекту, который вы еще не закончили (чтение async еще не закончено)? – AnthonyWJones

+0

Да, CloseAsync вообще не изменяет поведение службы (он все еще работает на localhost вместе с ним). –

ответ

2

Переключение на обработку клиента HTTP, поместив строку

WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp); 

в MainPage() конструктор исправлена ​​эта проблема мгновенно и для всех браузеров. Я понятия не имею, почему и как, но я просто собираюсь принять его и двигаться дальше.

http://msdn.microsoft.com/en-us/library/dd920295%28v=VS.95%29.aspx

+0

Было ли это время во всех других браузерах? –

+0

Он работал ненадолго в IE (и я думаю, Chrome, но я только один раз тестировал его и не помню), но никогда в Firefox. В течение последних трех дней это было тайм-аут во всех трех. –