如何从 .net 网络服务(JSON 响应)方法获取对 android 应用程序的响应
How to get response from .net webservice (JSON response) method to android application
我已经在 asp.net 中创建了 Web 服务,它给我 JSON 输出,但是当我从 android 设备调用该 Web 服务时,它给我错误。
我尝试了以下代码,但出现错误。
LoginActivity.java
public class LoginActivity extends Activity {
String response;
ProgressDialog progressDialog;
List<NameValuePair> parameters;
String mUrlWebServiceLogin = "http://www.example.com/MobileWeb/WS_Login.asmx/Login";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
parameters = new ArrayList<NameValuePair>();
parameters.add(new BasicNameValuePair("userName", "xyz"));
parameters.add(new BasicNameValuePair("password", "abc123"));
// Call Web Service
new CallWebService().execute();
}
public class CallWebService extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
// Call Webservice for Get Menus
WebServiceCall webServiceCall = new WebServiceCall(); // Custom class for call webservice
response = webServiceCall.makeServiceCall(mUrlWebServiceLogin, parameters);
Log.d("ResponseLogin:", response);
return null;
}
@Override
protected void onPostExecute(Void result) {
if (progressDialog.isShowing())
progressDialog.dismiss();
Toast.makeText(getApplicationContext(), "Done", Toast.LENGTH_LONG).show();
}
@Override
protected void onPreExecute() {
progressDialog = new ProgressDialog(LoginActivity.this);
progressDialog.setMessage("Loading...");
progressDialog.show();
progressDialog.setCanceledOnTouchOutside(false);
super.onPreExecute();
}
}
}
WebServiceCall.java
public class WebServiceCall {
static String response = null;
public final static int POST = 2;
public WebServiceCall() {
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
}
/*
* Making service call
* @url - url to make request
* @method - http request method
* */
public String makeServiceCall(String url) {
return this.makeServiceCall(url, null);
}
/*
* Making service call
* @url - url to make request
* @method - http request method
* @params - http request params
* */
public String makeServiceCall(String url, List<NameValuePair> params) {
try {
// http client
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpEntity httpEntity = null;
HttpResponse httpResponse = null;
// Checking http request method type
HttpPost httpPost = new HttpPost(url);
// adding post params
if (params != null) {
httpPost.setEntity(new UrlEncodedFormEntity(params));
}
httpResponse = httpClient.execute(httpPost);
httpEntity = httpResponse.getEntity();
response = EntityUtils.toString(httpEntity);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
}
WS_Login.asmx.cs(.net 网络服务文件)
namespace ForeverPayroll.MobileWeb
{
/// <summary>
/// Summary description for WS_Login
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
// [System.Web.Script.Services.ScriptService]
public class WS_Login : System.Web.Services.WebService
{
[WebMethod]
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
public void Login(string userName, string password)
{
DAL.dbOperation dboperation = new DAL.dbOperation();
dboperation.AddParameter("@EUserID", userName);
dboperation.AddParameter("@CompID", Convert.ToString(balUserlogin.m_Ds.Tables[0].Rows[0]["CompanyID"]));
DataSet ds = dboperation.getDataSet("Mobile_sp_tbl_Employee_Select_Fullinfo");
if (ds.Tables[0].Rows.Count > 0)
{
string[] selectedColumns = new[] { "EmployeePhoto", "EmployeeID", "EmpName", "EmployeementDate", "EDateOfBirth", "StateName", "BranchName", "CategoryName", "SubCatName", "DepartmentName", "DesignationName", "PaycaderName", "EProbation", "ECompanyEmail" };
DataTable dt = new DataView(ds.Tables[0]).ToTable(false, selectedColumns);
var list = new List<Dictionary<string, object>>();
foreach (DataRow row in dt.Rows)
{
var dict = new Dictionary<string, object>();
foreach (DataColumn col in dt.Columns)
{
row[col] = row[col].ToString();
dict[col.ColumnName] = row[col];
}
list.Add(dict);
}
HttpContext.Current.Response.Write(new JavaScriptSerializer().Serialize(list));
}
}
}
}
错误(从 android 调用网络服务时得到低于响应)
<html>
<head>
<title>Request format is unrecognized for URL unexpectedly ending in '/Login'.</title>
<style>
body {font-family:"Verdana";font-weight:normal;font-size: .7em;color:black;}
p {font-family:"Verdana";font-weight:normal;color:black;margin-top: -5px}
b {font-family:"Verdana";font-weight:bold;color:black;margin-top: -5px}
H1 { font-family:"Verdana";font-weight:normal;font-size:18pt;color:red }
H2 { font-family:"Verdana";font-weight:normal;font-size:14pt;color:maroon }
pre {font-family:"Lucida Console";font-size: .9em}
.marker {font-weight: bold; color: black;text-decoration: none;}
.version {color: gray;}
.error {margin-bottom: 10px;}
.expandable { text-decoration:underline; font-weight:bold; color:navy; cursor:hand; }
</style>
</head>
<body bgcolor="white">
<span><H1>Server Error in '/' Application.<hr width=100% size=1 color=silver></H1>
<h2> <i>Request format is unrecognized for URL unexpectedly ending in '/Login'.</i> </h2></span>
<font face="Arial, Helvetica, Geneva, SunSans-Regular, sans-serif ">
<b> Description: </b>An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
<br><br>
<b> Exception Details: </b>System.InvalidOperationException: Request format is unrecognized for URL unexpectedly ending in '/Login'.<br><br>
<b>Source Error:</b> <br><br>
<table width=100% bgcolor="#ffffcc">
<tr>
<td>
<code>
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.</code>
</td>
</tr>
</table>
<br>
<b>Stack Trace:</b> <br><br>
<table width=100% bgcolor="#ffffcc">
<tr>
<td>
<code><pre>
[InvalidOperationException: Request format is unrecognized for URL unexpectedly ending in '/Login'.]
System.Web.Services.Protocols.WebServiceHandlerFactory.CoreGetHandler(Type type, HttpContext context, HttpRequest request, HttpResponse response) +401372
System.Web.Services.Protocols.WebServiceHandlerFactory.GetHandler(HttpContext context, String verb, String url, String filePath) +281
System.Web.Script.Services.ScriptHandlerFactory.GetHandler(HttpContext context, String requestType, String url, String pathTranslated) +89
System.Web.MaterializeHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +425
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +263
</pre></code>
</td>
</tr>
</table>
<br>
<hr width=100% size=1 color=silver>
<b>Version Information:</b> Microsoft .NET Framework Version:2.0.50727.5485; ASP.NET Version:2.0.50727.5491
</font>
</body>
</html>
<!--
[InvalidOperationException]: Request format is unrecognized for URL unexpectedly ending in '/Login'.
at System.Web.Services.Protocols.WebServiceHandlerFactory.CoreGetHandler(Type type, HttpContext context, HttpRequest request, HttpResponse response)
at System.Web.Services.Protocols.WebServiceHandlerFactory.GetHandler(HttpContext context, String verb, String url, String filePath)
at System.Web.Script.Services.ScriptHandlerFactory.GetHandler(HttpContext context, String requestType, String url, String pathTranslated)
at System.Web.HttpApplication.MaterializeHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteS
当我 运行 来自 Visual studio 2012 的网络服务时,它将响应完成..在 JSON 中...响应如下..:
[{"EmployeePhoto":"1003-defaultmale.png","EmployeeID":"1003","EmpName":"John Cena","EmployeementDate":"01 Oct 1994","EDateOfBirth":"21 Oct 1963","StateName":"Gujarat","BranchName":"Personnel and Admin","CategoryName":"Staff","SubCatName":"Technical","DepartmentName":"General Administration","DesignationName":"SENIOR CASHIER","PaycaderName":"E1","EProbation":"0","ECompanyEmail":"robert@gmail.com"}]
看来你的url不对
String mUrlWebServiceLogin = "http://www.example.com/MobileWeb/WS_Login.asmx/Login";
将您的 url 附加到此 ?userName=xyz&password=abc123
并在您的浏览器中请求。如果您收到 JSON 响应,则您的 android 代码一定有效。
编辑
要测试 post 请求,请使用 curl
curl --data "userName=xyz&password=abc123" http://example.com
添加到配置文件中(毕竟我得到了解决方案)
<location path="YourWebservice.asmx">
<system.web>
<webServices>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</webServices>
</system.web>
</location>
我已经在 asp.net 中创建了 Web 服务,它给我 JSON 输出,但是当我从 android 设备调用该 Web 服务时,它给我错误。 我尝试了以下代码,但出现错误。
LoginActivity.java
public class LoginActivity extends Activity {
String response;
ProgressDialog progressDialog;
List<NameValuePair> parameters;
String mUrlWebServiceLogin = "http://www.example.com/MobileWeb/WS_Login.asmx/Login";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
parameters = new ArrayList<NameValuePair>();
parameters.add(new BasicNameValuePair("userName", "xyz"));
parameters.add(new BasicNameValuePair("password", "abc123"));
// Call Web Service
new CallWebService().execute();
}
public class CallWebService extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
// Call Webservice for Get Menus
WebServiceCall webServiceCall = new WebServiceCall(); // Custom class for call webservice
response = webServiceCall.makeServiceCall(mUrlWebServiceLogin, parameters);
Log.d("ResponseLogin:", response);
return null;
}
@Override
protected void onPostExecute(Void result) {
if (progressDialog.isShowing())
progressDialog.dismiss();
Toast.makeText(getApplicationContext(), "Done", Toast.LENGTH_LONG).show();
}
@Override
protected void onPreExecute() {
progressDialog = new ProgressDialog(LoginActivity.this);
progressDialog.setMessage("Loading...");
progressDialog.show();
progressDialog.setCanceledOnTouchOutside(false);
super.onPreExecute();
}
}
}
WebServiceCall.java
public class WebServiceCall {
static String response = null;
public final static int POST = 2;
public WebServiceCall() {
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
}
/*
* Making service call
* @url - url to make request
* @method - http request method
* */
public String makeServiceCall(String url) {
return this.makeServiceCall(url, null);
}
/*
* Making service call
* @url - url to make request
* @method - http request method
* @params - http request params
* */
public String makeServiceCall(String url, List<NameValuePair> params) {
try {
// http client
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpEntity httpEntity = null;
HttpResponse httpResponse = null;
// Checking http request method type
HttpPost httpPost = new HttpPost(url);
// adding post params
if (params != null) {
httpPost.setEntity(new UrlEncodedFormEntity(params));
}
httpResponse = httpClient.execute(httpPost);
httpEntity = httpResponse.getEntity();
response = EntityUtils.toString(httpEntity);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
}
WS_Login.asmx.cs(.net 网络服务文件)
namespace ForeverPayroll.MobileWeb
{
/// <summary>
/// Summary description for WS_Login
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
// [System.Web.Script.Services.ScriptService]
public class WS_Login : System.Web.Services.WebService
{
[WebMethod]
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
public void Login(string userName, string password)
{
DAL.dbOperation dboperation = new DAL.dbOperation();
dboperation.AddParameter("@EUserID", userName);
dboperation.AddParameter("@CompID", Convert.ToString(balUserlogin.m_Ds.Tables[0].Rows[0]["CompanyID"]));
DataSet ds = dboperation.getDataSet("Mobile_sp_tbl_Employee_Select_Fullinfo");
if (ds.Tables[0].Rows.Count > 0)
{
string[] selectedColumns = new[] { "EmployeePhoto", "EmployeeID", "EmpName", "EmployeementDate", "EDateOfBirth", "StateName", "BranchName", "CategoryName", "SubCatName", "DepartmentName", "DesignationName", "PaycaderName", "EProbation", "ECompanyEmail" };
DataTable dt = new DataView(ds.Tables[0]).ToTable(false, selectedColumns);
var list = new List<Dictionary<string, object>>();
foreach (DataRow row in dt.Rows)
{
var dict = new Dictionary<string, object>();
foreach (DataColumn col in dt.Columns)
{
row[col] = row[col].ToString();
dict[col.ColumnName] = row[col];
}
list.Add(dict);
}
HttpContext.Current.Response.Write(new JavaScriptSerializer().Serialize(list));
}
}
}
}
错误(从 android 调用网络服务时得到低于响应)
<html>
<head>
<title>Request format is unrecognized for URL unexpectedly ending in '/Login'.</title>
<style>
body {font-family:"Verdana";font-weight:normal;font-size: .7em;color:black;}
p {font-family:"Verdana";font-weight:normal;color:black;margin-top: -5px}
b {font-family:"Verdana";font-weight:bold;color:black;margin-top: -5px}
H1 { font-family:"Verdana";font-weight:normal;font-size:18pt;color:red }
H2 { font-family:"Verdana";font-weight:normal;font-size:14pt;color:maroon }
pre {font-family:"Lucida Console";font-size: .9em}
.marker {font-weight: bold; color: black;text-decoration: none;}
.version {color: gray;}
.error {margin-bottom: 10px;}
.expandable { text-decoration:underline; font-weight:bold; color:navy; cursor:hand; }
</style>
</head>
<body bgcolor="white">
<span><H1>Server Error in '/' Application.<hr width=100% size=1 color=silver></H1>
<h2> <i>Request format is unrecognized for URL unexpectedly ending in '/Login'.</i> </h2></span>
<font face="Arial, Helvetica, Geneva, SunSans-Regular, sans-serif ">
<b> Description: </b>An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
<br><br>
<b> Exception Details: </b>System.InvalidOperationException: Request format is unrecognized for URL unexpectedly ending in '/Login'.<br><br>
<b>Source Error:</b> <br><br>
<table width=100% bgcolor="#ffffcc">
<tr>
<td>
<code>
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.</code>
</td>
</tr>
</table>
<br>
<b>Stack Trace:</b> <br><br>
<table width=100% bgcolor="#ffffcc">
<tr>
<td>
<code><pre>
[InvalidOperationException: Request format is unrecognized for URL unexpectedly ending in '/Login'.]
System.Web.Services.Protocols.WebServiceHandlerFactory.CoreGetHandler(Type type, HttpContext context, HttpRequest request, HttpResponse response) +401372
System.Web.Services.Protocols.WebServiceHandlerFactory.GetHandler(HttpContext context, String verb, String url, String filePath) +281
System.Web.Script.Services.ScriptHandlerFactory.GetHandler(HttpContext context, String requestType, String url, String pathTranslated) +89
System.Web.MaterializeHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +425
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +263
</pre></code>
</td>
</tr>
</table>
<br>
<hr width=100% size=1 color=silver>
<b>Version Information:</b> Microsoft .NET Framework Version:2.0.50727.5485; ASP.NET Version:2.0.50727.5491
</font>
</body>
</html>
<!--
[InvalidOperationException]: Request format is unrecognized for URL unexpectedly ending in '/Login'.
at System.Web.Services.Protocols.WebServiceHandlerFactory.CoreGetHandler(Type type, HttpContext context, HttpRequest request, HttpResponse response)
at System.Web.Services.Protocols.WebServiceHandlerFactory.GetHandler(HttpContext context, String verb, String url, String filePath)
at System.Web.Script.Services.ScriptHandlerFactory.GetHandler(HttpContext context, String requestType, String url, String pathTranslated)
at System.Web.HttpApplication.MaterializeHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteS
当我 运行 来自 Visual studio 2012 的网络服务时,它将响应完成..在 JSON 中...响应如下..:
[{"EmployeePhoto":"1003-defaultmale.png","EmployeeID":"1003","EmpName":"John Cena","EmployeementDate":"01 Oct 1994","EDateOfBirth":"21 Oct 1963","StateName":"Gujarat","BranchName":"Personnel and Admin","CategoryName":"Staff","SubCatName":"Technical","DepartmentName":"General Administration","DesignationName":"SENIOR CASHIER","PaycaderName":"E1","EProbation":"0","ECompanyEmail":"robert@gmail.com"}]
看来你的url不对
String mUrlWebServiceLogin = "http://www.example.com/MobileWeb/WS_Login.asmx/Login";
将您的 url 附加到此 ?userName=xyz&password=abc123
并在您的浏览器中请求。如果您收到 JSON 响应,则您的 android 代码一定有效。
编辑 要测试 post 请求,请使用 curl
curl --data "userName=xyz&password=abc123" http://example.com
添加到配置文件中(毕竟我得到了解决方案)
<location path="YourWebservice.asmx">
<system.web>
<webServices>
<protocols>
<add name="HttpGet"/>
<add name="HttpPost"/>
</protocols>
</webServices>
</system.web>
</location>