2012-11-16 3 views
3

JavaScript 웹 사이트 (JavaScript 파일, 이미지 등)도 제공하는자가 호스팅 웹 서비스 (WebServiceHost)가 있습니다.이 서비스는 .net 4.0 (vs2010)에서 제대로 실행됩니다.WCF HTTP 서비스 : vs2012 설치 응용 프로그램이 깨졌습니다.

이제 vs2012를 설치했고 내 앱이 손상된 것으로 보입니다. (여전히 vs2010을 사용하고 있습니다. 아마도 .net 4.5 설치가 원인 일 수 있습니다). 그것은 잘 컴파일하고 런타임 오류가 있지만 html과 자바 스크립트가 어떤 상황에서는 깨진 것 같습니다. 여기에 (내 생각) 관련 codefragments은 다음과 같습니다

사용 인터페이스 (System.Data.Services)는 : 메시지의

public interface IRequestHandler 
{ 
    Message ProcessRequestForMessage(Stream messageBody); 
} 

창조 :

string filePath = _physicalPath + string.Join("\\", incomingRequest.UriTemplateMatch.RelativePathSegments.ToArray()); 
HttpResponseMessageProperty responseProperty = new HttpResponseMessageProperty(); 

if (File.Exists(filePath) && SetContentType(responseProperty.Headers, Path.GetExtension(filePath).ToLower())) 
{ 
    Message message = Message.CreateMessage(MessageVersion.None, "", HttpServiceBodyWriter.Create(filePath)); 
    message.Properties.Add(WebBodyFormatMessageProperty.Name, new WebBodyFormatMessageProperty(WebContentFormat.Raw)); 
    message.Properties.Add(HttpResponseMessageProperty.Name, responseProperty); 
} 

HttpServiceBodyWriter :

class HttpServiceBodyWriter : StreamBodyWriter 
{ 
    private System.IO.Stream _source = null; 

    private HttpServiceBodyWriter(System.IO.Stream source) : base(false) 
    { 
     _source = source; 
    } 

    protected override void OnWriteBodyContents(System.IO.Stream stream) 
    { 
     _source.CopyTo(stream); 
    } 

    internal static HttpServiceBodyWriter Create(System.Net.WebResponse response) 
    { 
     return new HttpServiceBodyWriter(response.GetResponseStream()); 
    } 

    internal static HttpServiceBodyWriter Create(string filePath) 
    { 
     return new HttpServiceBodyWriter(File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)); 
    } 
} 
Somtimes 올바른 페이지가 제공됩니다

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
    <<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
    <> 
    ..... 

:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta charset="UTF-8" /> 
.... 
나는 HTML 페이지를 요청하면 16,

이 때로는 손상된 페이지 ("머리"후 이중 DTD 정의와 빈 태그 참조) 제공

초기 페이지 요청이 항상 올바른 페이지를 전달하는 것처럼 보입니다. 순차적 인 요청이 손상됩니다.

누구에게이 이상한 행동에 대한 설명이 있습니까? 어떤 도움을 주셔서 감사합니다 (이 문제는 나에게 C++ 시대를 떠올리게합니다). 나는 당신이이 문제를 재현 할 수있는 작은 프로젝트를 만든

<system.serviceModel> 
    <diagnostics> 
    <messageLogging logEntireMessage="true" logMalformedMessages="true" logMessagesAtServiceLevel="false" logMessagesAtTransportLevel="true" maxMessagesToLog="300000" maxSizeOfMessageToLog="200000" /> 
    </diagnostics> 
    <services> 
    <service name="WcfTest.HttpService" behaviorConfiguration="DataServiceBehavior"> 
     <endpoint name="DataService" binding="webHttpBinding" bindingConfiguration="DataService" contract="System.Data.Services.IRequestHandler" /> 
     <host> 
     <baseAddresses> 
      <add baseAddress="http://localhost:8080/TestSite/" /> 
     </baseAddresses> 
     </host> 
    </service> 
    </services> 
    <behaviors> 
    <endpointBehaviors /> 
    <serviceBehaviors> 
     <behavior name="DataServiceBehavior"> 
     <serviceDebug includeExceptionDetailInFaults="False" /> 
     <dataContractSerializer maxItemsInObjectGraph="1000000" /> 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceThrottling maxConcurrentCalls="200" maxConcurrentInstances="2147483647" maxConcurrentSessions="200" /> 
     </behavior> 
    </serviceBehaviors> 
    </behaviors> 
    <bindings> 
    <webHttpBinding> 
     <binding name="DataService" maxReceivedMessageSize="5000000" maxBufferPoolSize="5000000" maxBufferSize="5000000" closeTimeout="00:03:00" openTimeout="00:03:00" receiveTimeout="00:10:00" sendTimeout="00:03:00"> 
     <readerQuotas maxStringContentLength="5000000" maxArrayLength="5000000" maxBytesPerRead="5000000" /> 
     <security mode="None"/> 
     </binding> 
    </webHttpBinding> 
    </bindings> 
</system.serviceModel> 

업데이트 :

이것은의 app.config의 ServiceModel은 서비스 섹션이다. 여기에서 다운로드 할 수 있습니다 : https://skydrive.live.com/redir?resid=CBC3C885DE2032B8!131&authkey=!ALZOaSL0V0s-itM

손상된 html이 나타날 때까지 브라우저의 새로 고침 버튼을 여러 번 누르기 만하면됩니다.

+0

이미 시도한 적이 없다면 서비스 호스트를 다시 컴파일하고 재배포하여 프레임 워크의 v4.0을 가리키고 있는지 확인하십시오. –

+0

감사합니다. Gabe, 이미 시도했습니다. – Jeldrik

답변

1

이것은 메시지 로깅을 활성화하는 webHttpBinding + 4.5의 알려진 문제점입니다. 그리고 http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/2bc5e5a6-1971-46cb-8b4f-f1c46130faca과 같습니다. 서비스에서 메시지 로깅을 사용하는 경우이 문제가 발생합니다. 이 문제에 대한 해결책이 제공 될 때까지 설정에서이 행을 주석 처리하여 앱 구성 파일의 메시지 로깅을 비활성화하십시오. 메시지 로깅을 사용하지 않도록 설정하면 응용 프로그램이 올바르게 작동하는지 확인했습니다. 희망이 도움이!

<!-- 
<messageLogging logEntireMessage="true" logMalformedMessages="true" logMessagesAtServiceLevel="false" logMessagesAtTransportLevel="true" 
maxMessagesToLog="300000" maxSizeOfMessageToLog="200000" />--> 
+0

Thanks Praburaj,하지만 메시지 로깅 기능이 활성화되지 않았습니다.물론 그것은 같은 문제입니까? 참조 용으로 app.config를 추가했습니다. – Jeldrik

+0

@Jeldrik, skydrive에 업로드 한 프로젝트에서 메시지 로깅을 사용하도록 설정했습니다. 나는 이것이 똑같은 문제라고 확신한다. 구성에서 messageLogging을 확인하고 태그를 비활성화하십시오. – Praburaj

+0

아, 죄송합니다, 나는 그것을 간과했습니다. 감사! 희망이 곧 바뀌면 ... – Jeldrik

0

우리는 동일한 문제에 직면했습니다. logMessagesAtTransportLevelfalse으로 설정하거나 설정을 제거하는 것이 도움이되었습니다.

관련 문제