2011-11-04 2 views
2

웹 서비스에서 데이터를 사용하는 ASP.NET이 C# 웹 응용 프로그램에 있습니다. 대부분의 경우 정상적으로 작동하지만 때로는 더 큰 데이터 세트를 요청할 때 Access is denied 오류 만 반환합니다.웹 서비스에서 일부 요청에 대해서만 "액세스가 거부되었습니다"를 반환합니다.

예를 들어, 특정 날짜 범위 사이에서 일부 문서를 반환하도록 서비스를 호출하면 범위가 충분히 작아서 정상적으로 작동합니다. 그러나 범위를 너무 멀리 확장하면이 오류가 반환됩니다. 이것은 내가 크기 또는 시간 문제라고 믿게 만든다.

그러나 반환하는 모든 문서를 반환하려고하면 대기없이 거의 즉시 Access 오류가 거부됩니다.

저는 서비스와 앱 사이의 문제, 또는 앱 구성 사이에 문제가 있음을 확신합니다.

내가 막연한 이유를 발견하는 데 도움을 줄 수있는 사람이 있습니까? 액세스가 거부되었습니다. 오류가 있습니까? 제가 제공해야 할 정보가 더 있다면 알려주십시오.

편집 : 웹 서비스를 제어합니다.

작은 Windows 양식 앱을 통해 서비스를 호출 해본 결과 아무런 오류도 발견되지 않았습니다.

일부 계약 고객을 통해 웹 서비스를 호출하고 있습니까? 구체적인 내용은 잘 모르겠지만 서비스를 가리키는 서비스 참조가 있고 클라이언트를 선언하고 그 안에 메서드를 사용할 수 있습니다.

브라우저에서 서비스에 액세스 할 수 있습니다.

기타 질문에 대해서는 아직 확실하지 않습니다. 나는 더 자세히 살펴볼 것이다.

편집 2 : 다음은 클라이언트에 대한 설정입니다 :

<?xml version="1.0"?> 
<configuration> 
    <connectionStrings> 
    //omitted 
    </connectionStrings> 
    <system.web> 
    <httpRuntime executionTimeout="300" maxRequestLength="51200" /> 
<pages theme="Theme1" /> 
<compilation debug="true" targetFramework="4.0"> 
    <assemblies> 
    //omitted 
    </assemblies> 
</compilation> 
<authentication mode="Windows" /> 
<authorization> 
    <deny users="?" /> 
</authorization> 
<membership> 
    <providers> 
    <clear /> 
    <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" /> 
    </providers> 
</membership> 
<profile> 
    <providers> 
    <clear /> 
    <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/" /> 
    </providers> 
</profile> 
<roleManager enabled="false"> 
    <providers> 
    <clear /> 
    <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" /> 
    <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" /> 
    </providers> 
</roleManager> 
<httpHandlers> 
    <add path="Telerik.Web.UI.WebResource.axd" type="Telerik.Web.UI.WebResource" verb="*" validate="false" /> 
</httpHandlers> 
</system.web> 
<system.webServer> 
<modules runAllManagedModulesForAllRequests="true" /> 
<validation validateIntegratedModeConfiguration="false" /> 
<handlers> 
    <add name="Telerik_Web_UI_WebResource_axd" verb="*" preCondition="integratedMode" path="Telerik.Web.UI.WebResource.axd" type="Telerik.Web.UI.WebResource" /> 
</handlers> 
</system.webServer> 
<appSettings> 
//omitted 
</appSettings> 
<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
      <binding name="DefaultEndpoint" closeTimeout="00:09:00" openTimeout="00:09:00" receiveTimeout="00:10:00" sendTimeout="00:09:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true"> 
     <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Ntlm" proxyCredentialType="None" realm="" /> 
     <message clientCredentialType="UserName" algorithmSuite="Default" /> 
     </security> 
    </binding> 
    <binding name="DefaultEndpoint1" closeTimeout="00:09:00" openTimeout="00:09:00" receiveTimeout="00:10:00" sendTimeout="00:09:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true"> 
     <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Ntlm" proxyCredentialType="None" realm="" /> 
     <message clientCredentialType="UserName" algorithmSuite="Default" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
<client> 
    <endpoint address="/*omitted*/ " binding="basicHttpBinding" behaviorConfiguration="ServiceBehavior" bindingConfiguration="DefaultEndpoint" contract="/*omitted*/ " name="DefaultEndpoint" /> 
    <endpoint address="/*omitted*/ " binding="basicHttpBinding" behaviorConfiguration="ServiceBehavior" bindingConfiguration="DefaultEndpoint1" contract="/*omitted*/ " name="DefaultEndpoint1" /> 
</client> 
<behaviors> 
    <endpointBehaviors> 
    <behavior name="ServiceBehavior"> 
     <dataContractSerializer maxItemsInObjectGraph="2147483647" /> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 
</system.serviceModel> 
</configuration> 

을 그리고 여기에 서비스에 대한 설정입니다 : 내가 여기에 몇 가지를 생략 한

<?xml version="1.0"?> 
<configuration> 
    <configSections> 
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=/*omitted*/" > 
     <section name="ITSLogger.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=/*omitted*/" requirePermission="false" /> 
    </sectionGroup> 
</configSections> 
<system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    <authentication mode="Windows"></authentication> 
    <!--<anonymousIdentification enabled="false"/>--> 
</system.web> 
<system.serviceModel> 
<services> 
    <service behaviorConfiguration="RWS.ServiceImplementation.ResearchService_Behavior" 
    name="RWS.ServiceImplementation.ResearchService"> 
    <endpoint address="" binding="basicHttpBinding" name="DefaultEndpoint" 
     bindingNamespace="http://researchwebservice.model/research" bindingConfiguration="userHttp" 
     contract="RWS.ServiceContracts.IResearchServiceContract"/> 
    <!--<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />--> 
    </service> 
</services> 
<bindings> 
    <basicHttpBinding> 
    <binding name="userHttp" 
      closeTimeout="00:01:00" 
      openTimeout="00:01:00" 
      receiveTimeout="00:10:00" 
      sendTimeout="00:01:00" 
      allowCookies="false" 
      bypassProxyOnLocal="false" 
      hostNameComparisonMode="StrongWildcard" 
      maxBufferSize="2147483647" 
      maxBufferPoolSize="2147483647" 
      maxReceivedMessageSize="2147483647" 
      messageEncoding="Text" 
      textEncoding="utf-8" 
      transferMode="Buffered" 
      useDefaultWebProxy="true"> 
     <readerQuotas maxDepth="2147483647" 
        maxStringContentLength="2147483647" 
        maxArrayLength="2147483647" 
        maxBytesPerRead="2147483647" 
        maxNameTableCharCount="2147483647" /> 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Ntlm" /> 
     <message clientCredentialType="UserName"/> 
     </security> 
    </binding> 

    </basicHttpBinding> 
</bindings> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name=""> 
     <serviceMetadata httpGetEnabled="false" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
     <dataContractSerializer maxItemsInObjectGraph="2147483647"/> 
    </behavior> 
    <behavior name="RWS.ServiceImplementation.ResearchService_Behavior"> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
     <serviceMetadata httpGetEnabled="true" /> 
     <dataContractSerializer maxItemsInObjectGraph="2147483647"/> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
</system.serviceModel> 
<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
</system.webServer> 
<connectionStrings> 
    <add name="ITSLogger.Properties.Settings.ITSLoggerConnectionString" 
     connectionString=/*omitted*/ 
     providerName="System.Data.SqlClient" /> 
</connectionStrings> 

<applicationSettings> 
    <ITSLogger.Properties.Settings> 
    <setting name="LogFilePath" serializeAs="String"> 
     <value>C:\ITSLogger\LoggerTest\</value> 
    </setting> 
    <setting name="MailServer" serializeAs="String"> 
    <value>/*omitted*/</value> 
    </setting> 
    <setting name="MailRecipient" serializeAs="String"> 
    <value>[email protected]</value> 
    </setting> 
    <setting name="CanLogToEmail" serializeAs="String"> 
    <value>False</value> 
    </setting> 
    <setting name="CanLogToFlatFile" serializeAs="String"> 
    <value>False</value> 
    </setting> 
    <setting name="CanLogToTrace" serializeAs="String"> 
    <value>False</value> 
    </setting> 
    <setting name="CanLogToConsole" serializeAs="String"> 
    <value>False</value> 
    </setting> 
    <setting name="CanLogToEventLog" serializeAs="String"> 
    <value>true</value> 
    </setting> 
    <setting name="CanLogToDB" serializeAs="String"> 
    <value>False</value> 
    </setting> 
</ITSLogger.Properties.Settings> 
</applicationSettings> 

<system.diagnostics> 
<sources> 
    <source name="System.ServiceModel" 
       switchValue="Information, ActivityTracing" 
       propagateActivity="true"> 
    <listeners> 
     <add name="traceListener" 
      type="System.Diagnostics.XmlWriterTraceListener" 
      initializeData= "/*omitted*/" /> 
    </listeners> 
    </source> 
</sources> 
</system.diagnostics> 

</configuration> 

거기 나는 너무 계시 될지도 모른다고 생각했다.

+0

웹 서비스를 직접 작성 했습니까? –

+0

추가 정보 필요. 웹 서비스를 제어합니까? 문제를 재현 할 수 있는지 테스트하려면 콘솔 앱과 같은 별도의 앱에서 서비스를 호출 해 보았습니까? Fiddler 2와 같은 디버깅 도구를 실행할 때 무엇을 볼 수 있습니까? 어떻게 웹 서비스를 부르니? 반환되는 실제 HTTP 상태 코드는 무엇입니까? 브라우저를 통해 웹 서비스에 액세스 할 수 있습니까? –

+0

WCF Webservice 또는 이전 스타일의 .asmx SOAP 서비스입니까? –

답변

7

서비스 및 클라이언트 구성 파일에서 구성 섹션을 게시 할 수 있다면 도움이됩니다.

바인딩의 maxReceivedMessageSize/MaxBufferSize/MaxBufferPoolSize 속성을 참조하고 값을 늘리십시오. http://msdn.microsoft.com/en-us/library/system.servicemodel.basichttpbinding.aspx

가능한 경우 WCF 추적을 설정하고 요청 및 응답 메시지를 확인하십시오.

+0

config 파일을 추가 했으므로 언급 한 모든 필드를 살펴 보겠습니다. 잘하면이 도움이됩니다. 응답 주셔서 감사합니다! – Jimmy

+0

제안 사항에 대한 문제를 해결할 수 없었습니다. 나는 그것을 훨씬 더 깊은 문제라고 생각한다. 그러나 당신의 대답에 가장 많은 상향 류식이 있었기 때문에 현상금을 수여했습니다. – Jimmy

6

웹 서비스에 액세스하여 디버깅 정보를 얻으려면 요청한 출력 데이터의 이진 크기를 확인해야합니다. 기본적으로 웹 서비스 (4096k)를 통해 전송 될 수있는 유한 한 제한이 있습니다. 당신은 web.config 파일에서 다음 속성을 변경하여이 설정을 무시할 수 있습니다 : 웹 서비스의 경우

<configuration> 
    <system.web> 
     <httpRuntime maxRequestLength="16256" /> 
    </system.web> 
</configuration> 

, 나는 액세스 거부 오류에서이 결과를 본 적이있다. 나는 예외가 아닌 왜 이런 식으로 표현하는지에 대한 만족스러운 응답을 얻지 못했습니다.

+0

너무 큰 요청 길이는 잠재적 인 DoS 공격으로 간주 될 수 있으므로 액세스 거부 오류가 발생할 수 있습니다. 어쨌든 내 추측이야. –

+0

@Sean Thoman : 그 말이 맞습니다. 버퍼 오버 플로우 공격, 네트워크 오버 플로우 등으로부터 시스템 메모리를 보호한다는 몇 가지 다른 제안을 보았습니다. 그들 모두 훌륭한 아이디어를 가지고 있으며, 모든 것을 받아 들일 수 있습니다. 진실로 행동이 일관 적이기 때문에. –

+0

이것은 내 희망을 얻었지만 슬프게도 내 문제를 해결하지 못했다. 나는 더 많은 세부 사항을 줄 수 있었으면 좋겠어.하지만 지금까지 머리를 쓰고있어. 어디서부터 시작해야할지 모르겠다. – Jimmy

0

서버에서 문서를 검색하는 데이터 유형을 파싱하는 경우. 서버에서 데이터 유형 간의 변환은 주로 오버 플로우로 인해 웹 서비스를 중단시킵니다.

관련 문제