【问题标题】:null pointer exception while accesing .net wcf services访问 .net wcf 服务时出现空指针异常
【发布时间】:2014-02-05 20:06:04
【问题描述】:

我是 Android 新手,我正在尝试从 android 访问 wcf 服务,它给出空指针异常, 这是我的 .net wcf 服务 IUserService

[ServiceContract]
public interface IUserService
{       [OperationContract]
    [WebInvoke(Method="GET",ResponseFormat = WebMessageFormat.Json,UriTemplate =    "GetName")]
    string GetName();      
}

这是我的用户服务

public class UserService : IUserService
{
public string GetName()
    {
        return "Hello ! ";
    }
}

这是我的 xml

 <service name="Lera.Template.Services.WCF.UserService">
    <endpoint address="" binding="webHttpBinding" contract="Lera.Template.Services.WCF.IUserService" 
              behaviorConfiguration="httpBehavior">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8888/Lera.Template.Services.WCF/UserService/" />
      </baseAddresses>
    </host>
  </service>    

我正在使用日食 这是我的主要活动

public class MainActivity extends Activity {

 private String values ="";
Button btn;
  TextView tv;
  private static String url = "http://192.168.12.146:8888/Lera.Template.Services.WCF/UserService/GetName";
  private static final String StringVal = "StringValue";
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);       


        JSONParser jParser = new JSONParser();

        // getting JSON string from URL
        JSONObject json = jParser.getJSONFromUrl(url); 
        try {

           String temp = json.getString(StringVal);          
            Toast toast = Toast.makeText(this ,temp , Toast.LENGTH_SHORT);
            toast.show();        

        } 

        catch (JSONException e) {
            e.printStackTrace();
        }

        catch (Exception ex) {
            Log.e("final:", ex.toString());
        }

 }
}

我正在使用 json 解析器类 公共类 JSONParser {

static InputStream is = null;
static JSONObject jObj = null;
static String json = "";

// constructor
public JSONParser() {

}

public JSONObject getJSONFromUrl(String url) {

    // Making HTTP request
    try {
        // defaultHttpClient
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpGet httpget = new HttpGet(url);

        HttpResponse httpResponse = httpClient.execute(httpget);
        HttpEntity httpEntity = httpResponse.getEntity();
        is = httpEntity.getContent();           

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
        Log.e("connection" , e.toString());
    }

    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();
        json = sb.toString();//here json type is string 
    } catch (Exception e) {
        Log.e("Buffer Error", "Error converting result " + e.toString());
    }

    // try parse the string to a JSON object
    try {
        jObj = new JSONObject(json);
    } catch (JSONException e) {
        Log.e("JSON Parser", "Error parsing data " + e.toString());
    }

    // return JSON String
    return jObj;

}
}

Wcf 服务在浏览器上运行良好,但是当我尝试从我的 android 应用程序访问时,它给出了空指针异常

给出空指针异常的行是

HttpResponse httpResponse = httpClient.execute(httpget); 

请帮我解决这个问题,我已经尝试了网上所有可用的东西,但仍然无法克服这个问题。

作为 A.S.提到我更新了我的主要活动课程 这是我与异步调用的主要活动,但异常是 连接到 url 被拒绝

public class MainActivity extends Activity implements OnClickListener {

 private String values ="";
Button btn;
  TextView tv;
  String uri = "http://192.168.0.144:8888/Lera.Template.Services.WCF/UserService/GetName";

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = (Button)this.findViewById(R.id.btnAccess);
        tv = (TextView)this.findViewById(R.id.tvAccess);
        btn.setOnClickListener(this);
    }

    @Override
    public void onClick(View arg0) {
        try
        {
        AsyncTaskExample task = new AsyncTaskExample(this);
        task.execute("");
        String  test = values;
        tv.setText(values);
        } catch(Exception e)
        {
           Log.e("Click Exception: ", e.getMessage());   
        }

    }

    public class AsyncTaskExample extends AsyncTask<String, Void,String>
    {
        private String Result="";
        //private final static String SERVICE_URI = "http://10.0.2.2:8889";
        private final static String SERVICE_URI = "http://192.168.12.146:8888/Lera.Template.Services.WCF/UserService";
        private MainActivity host;
        public AsyncTaskExample(MainActivity host)
        {
            this.host = host;
        }

        public String GetSEssion(String URL)
        {
          boolean isValid = true;
          if(isValid)
          {

              HttpClient client = new DefaultHttpClient();
              //http://192.168.0.144:8888/Lera.Template.Services.WCF/UserService/
             // HttpPost post = new HttpPost(uri);
              HttpGet httpget = new HttpGet(uri);
            httpget.setHeader("Accept", "application/json");
            httpget.setHeader("Content-type", "application/json; charset=utf-8");

              try
              {      
                HttpResponse response = client.execute(httpget) ;
                BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
                String line ="";
                while((line = rd.readLine()) != null)
                {
                    System.out.println(line);
                }
              }catch(Exception e)
              {
                  Log.e("Error:", e.getMessage());

              }
         }
          return Result;
        }

        @Override
        protected String doInBackground(String... arg0) {
            android.os.Debug.waitForDebugger();
            String t = GetSEssion(SERVICE_URI);
            return t;
        }

        @Override
        protected void onPostExecute(String result) {
        //  host.values = Result;
            super.onPostExecute(result);
        }
        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
        }

        @Override
        protected void onCancelled() {
            // TODO Auto-generated method stub
            super.onCancelled();
        }
    }

}

如有任何帮助,我们将不胜感激。 谢谢。

【问题讨论】:

  • 是 NetworkOnMainThread 问题吗?
  • @A.S.:谢谢您的回复,这些是我得到的异常 02-05 06:30:26.695: E/connection(3229): org.apache.http.conn.HttpHostConnectException: Connection to 192.168.0.144:80 拒绝 02-05 06:30:30.135:E/Buffer 错误(3229):转换结果时出错 java.lang.NullPointerException:lock == null 02-05 06:30:31.485:E/JSON 解析器(3229) : 解析数据 org.json.JSONException 时出错:在 02-05 06:30:34.745 的字符 0 处输入结束:E/final:(3229):java.lang.NullPointerException
  • 是的,您不能在主线程上发出任何 http 请求,请注意 AsyncTask 中的一些 http 连接教程
  • @A.S.:我也试过了,但让我再试一次。
  • 您真的应该尝试一下,因为 Android 会阻止 MainThread 上的任何 http 请求,因此您不会得到任何输出 => Nullpointer。

标签: c# java android json wcf


【解决方案1】:

否则我可以给你以下建议:不需要一个完整的类 (JSONParser) 只为一个方法。只需将方法和变量添加到 MainActivity。

编辑: 实际上你使用的是安卓设备还是模拟器?如果您使用的是模拟器,则可以使用 10.0.2.2 访问您的主机。您可以将您的网址更改为 http://10.0.2.2.146:8888/Lera.Template.Services.WCF/UserService/GetName

【讨论】:

  • 在编辑主要活动后我不再使用 jsonparser 类,将给出堆栈跟踪。
  • 是的,请这样做。您可能希望将 SERVICE_URI 更改为 192.168.12.146:8888/Lera.Template.Services.WCF/UserService/…
  • 感谢您的评论,我解决了我的问题,我重新创建了所有内容,现在一切正常。
猜你喜欢
  • 2012-11-26
  • 2015-03-22
  • 2011-11-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-31
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
相关资源
最近更新 更多