WebApi创建用户无法使用Xamarin.Android

时间:2017-06-13 02:34:21

标签: c# asp.net azure xamarin xamarin.android

我尝试使用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中的代码。

3 个答案:

答案 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;
    }
}

enter image description here

此外,这是一篇关于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);

    ....
}
相关问题