我尝试使用web api在xamarin.android中的sql azure中创建新用户。但每次我尝试创建新用户时都会收到此错误消息
{"$id":"1","message":"No HTTP resource was found that matches the request URI 'http://xamari/nlogin20170612105003.azurewebsites.net/api/Login'.","messageDetail":"No action was found
所以这个web api用于进行身份验证和创建新用户,我的登录很好没有错误,但是当我创建新用户时,我收到了错误消息。
这是我的web api控制器:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using XamarinLogin.Models;
namespace XamarinLogin.Controllers
[RoutePrefix("api/Login")]
{
public class LoginController: ApiController
{
xamarinloginEntities db = new xamarinloginEntities();
/
[HttpPost]
[ActionName("XAMARIN_REG")]
// POST: api/Login
public HttpResponseMessage Xamarin_reg(string username, string password)
{
Login login = new Login();
login.Username = username;
login.Password = password;
db.Logins.Add(login);
db.SaveChanges();
return Request.CreateResponse(HttpStatusCode.Accepted, "Successfully Created");
}
[HttpGet]
[ActionName("XAMARIN_Login")]
// GET: api/Login/5
public HttpResponseMessage Xamarin_login(string username, string password)
{
var user = db.Logins.Where(x => x.Username == username && x.Password == password).FirstOrDefault();
if (user == null)
{
return Request.CreateResponse(HttpStatusCode.Unauthorized, "Please Enter valid UserName and Password");
}
else
{
return Request.CreateResponse(HttpStatusCode.Accepted, "Success");
}
}
}
}
这是我在xamarin.android中的创建用户脚本:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Http;
using System.Net.Http.Headers;
using Newtonsoft.Json;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
namespace LoginAzureDroid
{
public class NewUserActivity : Activity
{
EditText txtusername;
EditText txtPassword;
Button btncreate;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
// Create your application here
SetContentView(Resource.Layout.Reg);
txtusername = FindViewById<EditText>(Resource.Id.txtsaveusername);
txtPassword = FindViewById<EditText>(Resource.Id.txtsavepassword);
btncreate = FindViewById<Button>(Resource.Id.btnsavecreate);
btncreate.Click += Btncreate_Click;
}
private async void Btncreate_Click(object sender, EventArgs e)
{
Login log = new Login();
log.username = txtusername.Text;
log.password = txtPassword.Text;
HttpClient client = new HttpClient();
string url = "http://xamarinlogin20170612105003.azurewebsites.net/api/Login";
var uri = new Uri(url);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response;
var json = JsonConvert.SerializeObject(log);
var content = new StringContent(json, Encoding.UTF8, "application/json");
response = await client.PostAsync(uri, content);
if (response.StatusCode == System.Net.HttpStatusCode.Accepted)
{
var errorMessage1 = response.Content.ReadAsStringAsync().Result.Replace("\\", "").Trim(new char[1]
{
'"'
});
Toast.MakeText(this, errorMessage1, ToastLength.Long).Show();
}
else
{
var errorMessage1 = response.Content.ReadAsStringAsync().Result.Replace("\\", "").Trim(new char[1]
{
'"'
});
Toast.MakeText(this, errorMessage1, ToastLength.Long).Show();
}
}
}
}
所以我的错在这里,是我的网址吗?我在web api中的代码?或者我在xamarin.android中的代码。
答案 0 :(得分:1)
{&#34; $ id&#34;:&#34; 1&#34;,&#34; message&#34;:&#34;未找到与请求URI匹配的HTTP资源&#39; http://xamari/nlogin20170612105003.azurewebsites.net/api/Login&#39;。&#34;,&#34; messageDetail&#34;:&#34;未找到任何操作
根据您的代码,您为LoginController
添加了 RoutePrefix ,我假设您需要为每个或您的操作添加路由属性,如下所示:
[HttpPost]
[Route("XAMARIN_REG")]
// POST: api/Login/XAMARIN_REG
public HttpResponseMessage Xamarin_reg(string username, string password)
[HttpGet]
[Route("XAMARIN_Login")]
// GET: api/Login/XAMARIN_Login?username={username}&password={password}
public HttpResponseMessage Xamarin_login(string username, string password)
要创建新用户,您需要更改网址,如下所示:
string url = "http://xamarinlogin20170612105003.azurewebsites.net/api/Login/XAMARIN_REG";
另外,您可以参考Attribute Routing in ASP.NET Web API 2了解更多详情。
<强>更新强>
您可以为用户注册定义视图模型,如下所示:
public class RegUser
{
public string username {get;set;}
public string password {get;set;}
}
[RoutePrefix("api/Login")]
public class LoginController : ApiController
{
[HttpPost]
[Route("regUser")]
public string newUser(RegUser user)
{
return user.username + "_" + user.password;
}
}
此外,这是一篇关于pass multiple parameters to Web API controller methods的博客,您可以参考多种方法。
答案 1 :(得分:1)
我有同样的问题,但我解决了这个问题。
<强>解决:强>
string url = "http://xamarinlogin20170612105003.azurewebsites.net/api/Login/XAMARIN_REG/username=" + user.username+ "&password=" + user.password";
答案 2 :(得分:0)
您的API端点期望在网址中发送值(用户名和密码),但您要将其发送到名为Login
的对象和帖子正文中。这就是找不到操作的原因
要解决此问题,您可以更改API签名以反映我上面解释的内容,或者将移动应用中的代码更改为
var parameters = new Dictionary<string, string> { { "username", txtusername.Text}, { "password", txtPassword.Text } };
var content = new FormUrlEncodedContent (parameters);
response = await client.PostAsync(uri, content);
同样作为建议,当使用HttpClient
进行单个HTTP操作时,请尝试在完成后始终处置该对象。你可以使用这样的using
子句来实现这个目的:
string url = "http://xamarinlogin20170612105003.azurewebsites.net/api/Login";
using (HttpClient client = new HttpClient())
{
....
var response = await client.PostAsync(new Uri(url), content);
....
}