Programing

WCF 서비스 클라이언트 : 콘텐츠 유형 text / html;

crosscheck 2020. 12. 2. 08:02
반응형

WCF 서비스 클라이언트 : 콘텐츠 유형 text / html; 응답 메시지의 charset = utf-8이 바인딩의 콘텐츠 유형과 일치하지 않습니다.


내 로컬 IIS 서버에서 실행되는 WCF 서비스가 있습니다. 나는 그것을 C # 웹 사이트 프로젝트에 대한 서비스 참조로 추가했으며 잘 추가되고 프록시 클래스를 자동으로 생성합니다.

그러나 서비스 계약 중 하나를 호출하려고하면 다음 오류가 발생합니다.

설명 : 현재 웹 요청을 실행하는 동안 처리되지 않은 예외가 발생했습니다. 오류 및 코드에서 오류가 발생한 위치에 대한 자세한 내용은 스택 추적을 검토하십시오.

예외 세부 사항 :System.ServiceModel.ProtocolException : 콘텐츠 유형 text / html; 응답 메시지의 charset = utf-8이 바인딩의 콘텐츠 유형과 일치하지 않습니다 (application / soap + xml; charset = utf-8). 사용자 지정 인코더를 사용하는 경우 IsContentTypeSupported 메서드가 제대로 구현되었는지 확인합니다. 응답의 처음 1024 바이트는 다음과 같습니다. 'function bredir (d, u, r, v, c) {var w, h, wd, hd, bi; var b = false; var p = false; var s = [[ 300,250, false], [250,250, false], [240,400, false], [336,280, false], [180,150, false], [468,60, false], [234,60, false], [88,31, false], [120,90, false], [120,60, false], [120,240, false], [125,125, false], [728,90, false], [160,600, false], [120,600, false] , [300,600, false], [300,125, false], [530,300, false], [190,200, false], [470,250, false], [720,300, true], [500,350, true], [550,480, true]]; if (typeof (window.innerHeight) == 'number') {h = window.innerHeight; w = window.

또한 WCF 서비스와 통신하는 콘솔 응용 프로그램이 있으며 콘솔 앱은이 오류없이 메서드를 제대로 호출 할 수 있습니다.

아래는 내 구성 파일에서 발췌 한 것입니다.

WCF 서비스 Web.Config :

<system.serviceModel>
   <services>
      <service name="ScraperService" behaviorConfiguration="ScraperServiceBehavior">
         <endpoint address=""
                   binding="wsHttpBinding" 
                   bindingConfiguration="WSHttpBinding_IScraperService"
                   contract="IScraperService" />
         <endpoint address="mex" 
                   binding="mexHttpBinding" 
                   contract="IMetadataExchange" />
         <host>
            <baseAddresses>
                <add baseAddress="http://example.com" />
            </baseAddresses>
         </host>
      </service>
   </services>
   <bindings>
       <wsHttpBinding>
           <binding name="WSHttpBinding_IScraperService"
                    bypassProxyOnLocal="false" transactionFlow="false"
                    hostNameComparisonMode="StrongWildcard"
                    maxBufferPoolSize="2000000" maxReceivedMessageSize="2000000"
                    messageEncoding="Text" textEncoding="utf-8"
                    useDefaultWebProxy="true" allowCookies="false">
               <readerQuotas 
                     maxDepth="2000000" maxStringContentLength="2000000" 
                     maxArrayLength="2000000" maxBytesPerRead="2000000"
                     maxNameTableCharCount="2000000" />
               <reliableSession 
                     enabled="false" ordered="true" inactivityTimeout="00:10:00" />
               <security mode="Message">
                   <message clientCredentialType="Windows"
                            negotiateServiceCredential="true"
                            algorithmSuite="Default"
                            establishSecurityContext="true" />
               </security>
            </binding>
          </wsHttpBinding>
      </bindings>
      <behaviors>
          <serviceBehaviors>
              <behavior name="ScraperServiceBehavior">
                  <serviceMetadata httpGetEnabled="true" />
                  <serviceDebug includeExceptionDetailInFaults="true" />
              </behavior>
          </serviceBehaviors>
     </behaviors>
</system.serviceModel>

웹 사이트 프로젝트 서비스 클라이언트 Web.Config:

<system.serviceModel>
   <bindings>
      <wsHttpBinding>
          <binding name="WSHttpBinding_IScraperService" 
              closeTimeout="00:01:00" openTimeout="00:01:00" 
              receiveTimeout="00:10:00" sendTimeout="00:01:00"
              bypassProxyOnLocal="false" transactionFlow="false" 
              hostNameComparisonMode="StrongWildcard"
              maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
              messageEncoding="Text" textEncoding="utf-8"
              useDefaultWebProxy="true" allowCookies="false">
              <readerQuotas 
                  maxDepth="32" maxStringContentLength="8192" 
                  maxArrayLength="16384" maxBytesPerRead="4096" 
                  maxNameTableCharCount="16384" />
              <reliableSession enabled="false"
                  ordered="true" inactivityTimeout="00:10:00" />
              <security mode="Message">
                  <transport clientCredentialType="Windows" 
                       proxyCredentialType="None" realm="" />
                  <message clientCredentialType="Windows" 
                       negotiateServiceCredential="true"
                       algorithmSuite="Default" />
              </security>
          </binding>
       </wsHttpBinding>
    </bindings>
<client>
        <endpoint name="WSHttpBinding_IScraperService"
            address="http://example.com/ScraperService.svc"
            binding="wsHttpBinding" 
            bindingConfiguration="WSHttpBinding_IScraperService"
            contract="ScraperService.IScraperService" >
           <identity>
               <servicePrincipalName value="host/FreshNET-II" />
           </identity>
        </endpoint>
     </client>
</system.serviceModel>

이것은 WCF를 만드는 첫 번째 시도이므로 모두 매우 새롭습니다. 어떤 도움이라도 대단히 감사합니다.


클라이언트가 일반적으로 실행되는 것과 동일한 Windows 자격 증명을 사용하여 서비스를 호스팅하는 서버의 웹 브라우저에서 http : //localhost/ScraperService.svc찾아보십시오 .

IIS가 예상대로 xml을 반환하는 대신 일부 설명의 html 오류 메시지를 표시한다고 생각합니다.

인터넷 필터링을 수행하는 http 프록시 서버가있는 경우에도 발생할 수 있습니다. ContentKeeper에 대한 제 경험은 모든 http / https 트래픽을 가로 채서 "관리되지 않는 콘텐츠"로 차단한다는 것입니다. 우리가 반환하는 것은 html 오류 메시지뿐입니다. 이를 방지하려면 프록시가 사이트에 대한 트래픽을 가로 채지 않도록 Internet Explorer에 프록시 서버 예외 규칙을 추가 할 수 있습니다.

제어판> 인터넷 옵션> 연결> LAN 설정> 고급> 프록시 설정

여기에 이미지 설명 입력


웹 서버의 HTML 응답은 일반적으로 WCF 서비스의 응답 대신 오류 페이지가 제공되었음을 나타냅니다. 내 첫 번째 제안은 WCF 클라이언트를 실행중인 사용자가 리소스에 액세스 할 수 있는지 확인하는 것입니다.


비슷한 문제가있었습니다. 나는 그것을 변경하여 해결했습니다.

<basicHttpBinding>

...에

<basicHttpsBinding>

또한 http : // 대신 https : //를 사용하도록 URL을 변경했습니다.

또한 <endpoint> 노드에서

binding="basicHttpBinding" 

...에

binding="basicHttpsBinding"

이것은 효과가 있었다.


무슨 일이 일어나고 있는지는 기본적으로 보안 암호화 된 메시지 (보안 메시지)를 사용하는 wsHttpBind를 사용하여 서비스에 액세스하려고한다는 것입니다. 반면 netTcpBind는 보안 암호화 채널을 사용합니다. (보안 전송) ...하지만 basicHttpBind, 보안이 전혀 필요하지 않으며 익명으로 액세스 할 수 있습니다.

그래서. 서버 측에서 구성에 추가 / 변경합니다.

<bindings>
    <wsHttpBinding>
     <binding name="wsbind"> 
         <security mode="Message">
             <transport clientCredentialType="Windows" proxyCredentialType="None" />
             <message clientCredentialType="Windows" negotiateServiceCredential="true"
                            algorithmSuite="Default" establishSecurityContext="true" />
         </security>
     </binding>
    </wsHttpBinding>
</bindings>

그런 다음 엔드 포인트 변경을 추가하십시오.

<endpoint address="" binding="wsHttpBinding" bindingConfiguration="wsbind" name="wshttpbind" contract="WCFService.IService" > 

그렇게해야합니다.


제 경우에는 URL 재 작성 규칙이 내 서비스 이름을 엉망으로 만들고 소문자로 다시 작성되었고이 오류가 발생했습니다.

WCF 서비스 호출을 소문자로하지 마십시오.


많은 사람들과 마찬가지로 내 상황에서도 오류로 인해 이것을 얻었습니다. 그리고 슬프게도 html 오류 페이지의 CSS를 읽을 수있었습니다.

The source of my problem was also a rewrite rule on the server. It was rewriting http to https.


You may want to examine the configuration for your service and make sure that everything is ok. You can navigate to web service via the browser to see if the schema will be rendered on the browser.

You may also want to examine the credentials used to call the service.


I tried all the suggestions above, but what worked in the end was changing the Application Pool managed pipeline from Integrated mode to Classic mode.
It runs in its own application pool - but it was the first .NET 4.0 service - all other servicves are on .NET 2.0 using Integrated pipeline mode. Its just a standard WCF service using is https - but on Server 2008 (not R2) - using IIS 7 (not 7.5) .


I had a similar situation, but the client config was using a basicHttpBinding. The issue turned out to be that the service was using SOAP 1.2 and you can't specify SOAP 1.2 in a basicHttpBinding. I modified the client config to use a customBinding instead and everything worked. Here are the details of my customBinding for reference. The service I was trying to consume was over HTTPS using UserNameOverTransport.

<customBinding>
    <binding name="myBindingNameHere" sendTimeout="00:03:00">
        <security authenticationMode="UserNameOverTransport" includeTimestamp="false">
            <secureConversationBootstrap />
        </security>
        <textMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16"
              messageVersion="Soap12" writeEncoding="utf-8">
            <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                maxBytesPerRead="4096" maxNameTableCharCount="16384" />
        </textMessageEncoding>
        <httpsTransport manualAddressing="false" maxBufferPoolSize="4194304"
              maxReceivedMessageSize="4194304" allowCookies="false" authenticationScheme="Basic"
              bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
              keepAliveEnabled="true" maxBufferSize="4194304" proxyAuthenticationScheme="Anonymous"
              realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
              useDefaultWebProxy="true" requireClientCertificate="false" />
    </binding>
</customBinding>

Even if you don't use network proxy, turning 'Automatically detect settings' in proxy dialog makes this exception go off.

여기에 이미지 설명 입력


In my WCF serive project this issue is due to Reference of System.Web.Mvc.dll 's different version. So it may be compatibility issue of DLL's different version

When I use

System.Web.Mvc.dll version 5.2.2.0 -> it thorows the Error The content type text/html; charset=utf-8 of the response message

but when I use System.Web.Mvc.dll version 4.0.0.0 or lower -> it works fine.

I don't know the reason of different version DLL's issue but by changing the DLL's verison it works for me.

This Error even generate when you add reference of other Project in your WCF Project and this reference project has different version of System.Web.Mvc DLL or could be any other DLL.


X++ binding = endPoint.get_Binding(); binding.set_UseDefaultWebProxy(false);


I solved this problem by setting UseCookies in web.config.

  <system.web>
    <sessionState cookieless="UseCookies" />

and setting enableVersionHeader

  <system.web>
    <httpRuntime targetFramework="4.5.1" enableVersionHeader="false" executionTimeout="1200" shutdownTimeout="1200" maxRequestLength="103424" />

If your are using both wshttpbinding along with https request, then i resolved it by using the below configuration change.

 <security mode="TransportWithMessageCredential">
                    <transport clientCredentialType="None" />
                    <message clientCredentialType="Certificate" />
                </security>

For me the issue was resolved when I commented the following line in Web.config

<httpErrors errorMode="Detailed" />

Hy, In my case this error appeared because the Application pool of the webservice had the wrong 32/64 bit setting. So this error needed the following fix: you go to the IIS, select the site of the webservice , go to Advanced setting and get the application pool. Then go to Application pools, select it, go to "Advanced settings..." , select the "Enable 32 bit applications" and make it Enable or Disable, according to the 32/64 bit type of your webservice. If the setting is True, it means that it only allows 32 bit applications, so for 64 bit apps you have to make it "Disable" (default).


For me, it was the web app connection string pointing to the wrong database server.


참고 : 대상 서버 끝 점이 SSL (Secure Socket Layer) 인증서를 사용하는 경우

.config 설정을에서 basicHttpBinding변경하십시오.basicHttpsBinding

나는 당신의 문제를 해결할 것이라고 확신합니다.

참고 URL : https://stackoverflow.com/questions/5243929/wcf-service-client-the-content-type-text-html-charset-utf-8-of-the-response-me

반응형