2012-05-02 8 views
21

मैं सर्वर से अनुरोध करने के लिए this link का संदर्भ देता हूं। समस्या कभी-कभी होती है (हमेशा नहीं, लगभग 20% - 30%, इसका मतलब है कि मैं सफल प्रतिक्रिया प्राप्त कर सकता हूं), मुझे 401 त्रुटि मिली और सर्वर प्रतिक्रिया मूल प्राधिकरण चुनौती अपेक्षित थी, लेकिन नहीं मिला।एंड्रॉइड में बुनियादी प्रमाणीकरण के साथ "HTTP/1.1 401 अनधिकृत" त्रुटि - ईडब्ल्यूएस 2010

HttpRequestInterceptor preemptiveAuth = new HttpRequestInterceptor() 
{ 
    public void process(final HttpRequest request, final HttpContext context) 
      throws HttpException, IOException 
    { 
     AuthState authState = (AuthState) context 
       .getAttribute(ClientContext.TARGET_AUTH_STATE); 
     CredentialsProvider credsProvider = (CredentialsProvider) context 
       .getAttribute(ClientContext.CREDS_PROVIDER); 
     HttpHost targetHost = (HttpHost) context 
       .getAttribute(ExecutionContext.HTTP_TARGET_HOST); 

     if (authState.getAuthScheme() == null) 
     { 
      AuthScope authScope = new AuthScope(targetHost.getHostName(), 
        targetHost.getPort()); 
      Credentials creds = credsProvider.getCredentials(authScope); 
      if (creds != null) 
      { 
       authState.setAuthScheme(new BasicScheme()); 
       authState.setCredentials(creds); 
      } 
     } 
    } 
}; 

यहाँ मेरी प्रमाणीकरण है:

HttpPost httpPost = new HttpPost(SERVER_AUTH_URL); 
     httpPost.setHeader("Content-type", "text/xml; charset=utf-8"); 
    httpPost.setHeader("Keep-Alive", "300"); 
    httpPost.setHeader("Connection", "Keep-Alive");  
    StringEntity se = new StringEntity(myRequest, "UTF-8"); 
    httpPost.setEntity(se); 
    se.setContentType("text/xml"); 
    se.setContentEncoding("gzip,deflate"); 

     //add preemptiveAuth 
     client.addRequestInterceptor(preemptiveAuth, 0); 
     //Set the proxy 
    ProxySelectorRoutePlanner routePlanner = new ProxySelectorRoutePlanner(
      client.getConnectionManager().getSchemeRegistry(), 
      ProxySelector.getDefault()); 
    client.setRoutePlanner(routePlanner); 

    List<String> authPrefs = new ArrayList<String>(); 
    authPrefs.add(AuthPolicy.BASIC); 
    authPrefs.add(AuthPolicy.NTLM); 
    authPrefs.add(AuthPolicy.DIGEST); 
    client.getParams().setParameter("http.auth.scheme-priority", authPrefs); 
    CredentialsProvider credProvider = new BasicCredentialsProvider();     
    // client.getParams().setParameter("http.auth.scheme-priority", 
    // authPrefs); 
    credProvider.setCredentials(AuthScope.ANY, 
      new NTCredentials(getUsername(), getPassword(), 
        "", getDomain())); 

    Log.d(TAG, "repair excute"); 
    client.setCredentialsProvider(credProvider); 
    HttpResponse response = client.execute(httpPost); 
    Log.d(TAG, "has excute"); 

टिप्पणी कोड से, आप देख सकते हैं मैं कई मायनों कोशिश की, लेकिन त्रुटि गायब नहीं था

यहाँ मेरी कोड है। यहां लॉगकैट कहता है:

05-02 10:28:21.724: D/dalvikvm(1169): GC_FOR_MALLOC freed 11259 objects/457352 bytes in 43ms 
05-02 10:28:22.384: D/MainActivity(1169): repair excute 
05-02 10:28:22.744: D/dalvikvm(1169): GC_FOR_MALLOC freed 11481 objects/447264 bytes in 67ms 
05-02 10:28:22.894: D/dalvikvm(1169): GC_FOR_MALLOC freed 1078 objects/83928 bytes in 76ms 
05-02 10:28:22.894: I/dalvikvm-heap(1169): Grow heap (frag case) to 3.833MB for 87396-byte allocation 
05-02 10:28:23.034: D/dalvikvm(1169): GC_FOR_MALLOC freed 58 objects/3336 bytes in 143ms 
05-02 10:28:23.124: W/DefaultRequestDirector(1169): Authentication error: basic authorization challenge expected, but not found 
05-02 10:28:23.124: D/MainActivity(1169): has excute 
05-02 10:28:23.124: E/MainActivity(1169): response error: HTTP/1.1 401 Unauthorized 

तो, कृपया मुझे बताएं कि मेरी समस्या कहां है। अग्रिम में धन्यवाद।
अद्यतन: लक्ष्य सर्वर एक्सचेंज वेब सेवा 2010 है। किसी कारण से, मैं ईडब्ल्यूएस एपीआई का उपयोग नहीं करना चाहता, मैंने सर्वर से कनेक्ट करने के लिए अपना स्वयं का एक्सएमएल अनुरोध किया (यह एक्सएमएल अनुरोध ठीक से काम करता है)। पहली बार

Server Microsoft-IIS/7.5 
WWW-Authenticate Negotiate 
WWW-Authenticate NTLM 
X-Powered-By ASP.NET 
Date Fri, 25 May 2012 03:47:57 GMT 
Content-Length 0 

जब अनुरोध सफलता:

Cache-Control private 
Transfer-Encoding chunked 
Content-Type text/xml; charset=utf-8 
Server Microsoft-IIS/7.5 
Set-Cookie exchangecookie=1d9d9b1d21064035ad375c8aecde2168; expires=Sat, 25-May-2013  04:00:46 GMT; path=/; HttpOnly 
X-AspNet-Version 2.0.50727 
X-Powered-By ASP.NET 
Date Fri, 25 May 2012 04:00:45 GMT 

और दूसरी बार:
और यहाँ सर्वर से प्रतिक्रिया हेडर जब अनुरोध विफल है

Cache-Control private 
Transfer-Encoding chunked 
Content-Type text/xml; charset=utf-8 
Server Microsoft-IIS/7.5 
X-EwsPerformanceData RpcC=4;RpcL=0;LdapC=0;LdapL=0; 
X-AspNet-Version 2.0.50727 
X-Powered-By ASP.NET 
Date Fri, 25 May 2012 04:00:47 GMT 

कुकी मेरी समस्या है, है ना?

+1

उपयोग Wireshark आधारित है यह आप क्या अपेक्षा भेज रहा है सुनिश्चित करने के लिए है। –

+0

धन्यवाद, मैं अनुरोध करने के लिए सोपूआई का उपयोग करता हूं, यह हमेशा काम करता है, लेकिन मुझे नहीं पता कि यह अभी भी त्रुटि क्यों है – R4j

+0

क्या आपके ऐप के बीच कोई प्रॉक्सी सर्वर बैठा है (यदि आप इसे एमुलेटर पर चलाते हैं, तो वास्तविक कंप्यूटर को संदर्भित करता है चलने वाला एमुलेटर) और लक्ष्य सर्वर? – yorkw

उत्तर

11

मैं पिछले सप्ताह एंड्रॉइड HTTP मूल के साथ संघर्ष कर रहा था। मैंने इसे करने के 3 या 4 अलग-अलग तरीकों की कोशिश की है और हमेशा मुझे कुछ समस्या मिली है। अभी मैं इसे काम करने में कामयाब रहा एकमात्र तरीका सबसे आसान तरीका था।

UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(user, pass); 
Header header = new BasicScheme().authenticate(credentials, mHttpRequest); 
mHttpRequest.addHeader(header); 

यह एंड्रॉइडहट्प क्लाइंट के साथ मेरे लिए काम करता है।

संपादित करें:

यह मेरा पूर्ण स्रोत कोड

https://gist.github.com/2642692

यह पर http://lukencode.com/2010/04/27/calling-web-services-in-android-using-httpclient/

+0

क्या आप अनुरोध करने के लिए अपना पूरा स्रोत कोड पोस्ट कर सकते हैं? – R4j

+0

मैंने अपने द्वारा उपयोग की जाने वाली कक्षा का स्रोत कोड जोड़ा। – Axxiss

+0

क्या आप एनटीएलएम प्रमाणीकरण का सुझाव देते हैं? क्योंकि मुझे यह त्रुटि मिलती है: "प्रमाणीकरण योजना ntlm समर्थित नहीं है" प्रमाणीकरण त्रुटि: इनमें से किसी भी चुनौती का जवाब देने में असमर्थ: {ntlm = WWW-प्रमाणीकरण: NTLM, बातचीत = WWW-प्रमाणीकरण: बातचीत करें – R4j

संबंधित मुद्दे