2014-09-22 4 views
0

Я использую ASP.NET, в которой я получаю запросы через глаголы GET, URL-адрес является специальным для этого приложения.Ошибка HTTP GET недопустима пользователем

Код работает, но если пользователь отправил пароль, он недействителен HTTP 200 Ok, ответьте мне и в теле сообщения «Fail user or pasword».

namespace WebApp_dev.Controllers 
{ 

    public class ValuesController : ApiController 
    { 


     [HttpGet] 
     public string Save(string point) 
     { 

      // in point variable you will get part between /dev and /save 
      // for /dev/point/save?name=125.25 url it will be "point" 

      // get parameters that follow by ? mark in url 

      var queryParams = GetQueryParams(Request); 
      string url_completa = Request.RequestUri.AbsolutePath; 

      int _indexPto = url_completa.IndexOf("/dev/"); 
      url_completa=url_completa.Remove(0, (_indexPto + 5)); 
      // _indexPto = url_completa.IndexOf("/"); 
      url_completa = url_completa.Remove(url_completa.IndexOf("/"), (url_completa.Length - url_completa.IndexOf("/"))); // tengo el nombre del punto en url_completa 
      //-------------------------------------------------- 
      string url_query = Request.RequestUri.Query; 
      _indexPto = url_query.IndexOf("&u="); 
      url_query = url_query.Remove(0, _indexPto+1); 
      string[] _User_pasw = url_query.Split(char.Parse("&"));//con esto queda la cadena separada el usuario y contraseña 
      string _usuario, _pasword; 
      _usuario = _User_pasw[0].Split(char.Parse("="))[1]; 
      _pasword = _User_pasw[1].Split(char.Parse("="))[1]; 
      bool _usuarioValido = UsuarioValido(_usuario, _pasword); 



      if (_usuarioValido == false) 
      { 
      return "Fail user or pasword"; 
      } 

      // loop through all of them 
      foreach (var pair in queryParams) 
      { 
       string paramName = pair.Key; // for /dev/point/save?name=125.25 will be "name" 
       string paramvalue = queryParams[pair.Key]; // for /dev/point/save?name=125.25 will be 125.25 

      AlmacenarValor(url_completa.ToString(), paramvalue, paramName); 
      } 

      return "OK: " + url_completa.ToString(); 
     } 

     private bool UsuarioValido(string _usuario, string _pasword) 
     { 
      MonitoreoEntities _context = new MonitoreoEntities(); 
      PuntoDeMedicion _pdm = _context.PuntoDeMedicion.FirstOrDefault(a => a.Nombre == _usuario && a.Contrasena == _pasword); 
      if (_pdm == null) 
       return false; 
      else 
       return true; 
     } 

     private Dictionary<string, string> GetQueryParams(HttpRequestMessage request) 
     { 

      return request.GetQueryNameValuePairs() 
         .ToDictionary(kv => kv.Key, kv => kv.Value, 
           StringComparer.OrdinalIgnoreCase); 
     } 
    public static void AlmacenarValor(string _dispositivo, string _valor, string _parametro) 
    { 

     MonitoreoEntities _context = new MonitoreoEntities(); 
     PuntoDeMedicion _puntoDeMedicion = _context.PuntoDeMedicion.Include("EntradaSalida").Where(a => a.Nombre == _dispositivo).FirstOrDefault(); 
     foreach (EntradaSalida _entradasalida in _puntoDeMedicion.EntradaSalida) 
     { 
      if (_entradasalida.Etiqueta == _parametro) 
      { 
       Registro _registro = new Registro() 
       { 
        EntradaSalidaId = _entradasalida.Id, 
        FechaHoraCreacion = DateTime.Now, 
        FechaHoraRegistro = DateTime.Now, 
        PuntoDeMedicionId = _puntoDeMedicion.Id, 
        Valor = decimal.Parse(_valor) 
       }; 
       _context.Registro.Add(_registro); 
       _context.SaveChanges(); 
       break; 
      } 
      } 
     } 
    } 
} 

Использование Advanced REST клиент для Google Chrome:

пользователь Ответ Ok (Pasword ок)

200 OK Show explanation Loading time: 8723 
Request headers 
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36 
Content-Type: text/plain; charset=utf-8 
Accept: */* 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: es-ES,es;q=0.8,en;q=0.6 
Response headers 
Cache-Control: no-cache 
Pragma: no-cache 
Content-Type: application/json; charset=utf-8 
Expires: -1 
Server: Microsoft-IIS/8.0 
X-AspNet-Version: 4.0.30319 
X-SourceFiles: =?UTF-8?B?RDpcUHJveWVjdG8gdGVsZW1ldHJpYVxTZXJ2ZXJcV2ViQXBwX2RldlxkZXZccHJ1ZWJhMTIzXHNhdmU=?= 
X-Powered-By: ASP.NET 
Date: Mon, 22 Sep 2014 22:23:01 GMT 
Content-Length: 28 
Raw 
JSON 
Response 
Word wrap Copy to clipboard Save as file 

"OK: песни123"

Быстродействие пользователя Недопустимый пароль:

200 OK Show explanation Loading time: 1415 
Request headers 
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36 
Content-Type: text/plain; charset=utf-8 
Accept: */* 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: es-ES,es;q=0.8,en;q=0.6 
Response headers 
Cache-Control: no-cache 
Pragma: no-cache 
Content-Type: application/json; charset=utf-8 
Expires: -1 
Server: Microsoft-IIS/8.0 
X-AspNet-Version: 4.0.30319 
X-SourceFiles: =?UTF-8?B?RDpcUHJveWVjdG8gdGVsZW1ldHJpYVxTZXJ2ZXJcV2ViQXBwX2RldlxkZXZccHJ1ZWJhMTIzXHNhdmU=?= 
X-Powered-By: ASP.NET 
Date: Mon, 22 Sep 2014 22:30:14 GMT 
Content-Length: 18 
Raw 
JSON 
Response 
Copy to clipboard Save as file 

«пользователь Сбой или пароль»

Он запрограммирован таким образом, он работает правильно, я хотел бы изменить это сообщение и отправить HTTP 409 Conflict, если пользователь или неверный пароль, а http 200 Ok - правильно.

Большое спасибо за Ваш ответ

я получаю серию ошибок, будучи переменные в другом контексте:

*

_usuarioValido
url_completa

*

Как я могу сделать это из одного контекста в другой. код остался следующим образом:

public class ValuesController : ApiController 
    { 


     [HttpGet] 
     public string Save(string point) 
     { 

      // in point variable you will get part between /dev and /save 
      // for /dev/point/save?name=125.25 url it will be "point" 

      // get parameters that follow by ? mark in url 

      var queryParams = GetQueryParams(Request); 
      string url_completa = Request.RequestUri.AbsolutePath; 
      // Busco el nombre del punto de medicion----------- 
      int _indexPto = url_completa.IndexOf("/dev/"); 
      url_completa=url_completa.Remove(0, (_indexPto + 5)); 
      // _indexPto = url_completa.IndexOf("/"); 
      url_completa = url_completa.Remove(url_completa.IndexOf("/"), (url_completa.Length - url_completa.IndexOf("/"))); // tengo el nombre del punto en url_completa 
      //-------------------------------------------------- 
      string url_query = Request.RequestUri.Query; 
      _indexPto = url_query.IndexOf("&u="); 
      url_query = url_query.Remove(0, _indexPto+1); 
      string[] _User_pasw = url_query.Split(char.Parse("&"));//con esto queda la cadena separada el usuario y contraseña 
      string _usuario, _pasword; 
      _usuario = _User_pasw[0].Split(char.Parse("="))[1]; 
      _pasword = _User_pasw[1].Split(char.Parse("="))[1]; 
      bool _usuarioValido = UsuarioValido(_usuario, _pasword); 



      if (_usuarioValido == false) 
      { 
     return "Usuario invalido"; 
      } 

      // loop through all of them 
      foreach (var pair in queryParams) 
      { 
       string paramName = pair.Key; // for /dev/point/save?name=125.25 will be "name" 
       string paramvalue = queryParams[pair.Key]; // for /dev/point/save?name=125.25 will be 125.25 

      AlmacenarValor(url_completa.ToString(), paramvalue, paramName); 
      } 

      return "SUCCESS OK de: " + url_completa.ToString()+"\n";// mando el ok, tiene que llevar el fin de linea. 
     } 

    [HttpGet] 
    [ResponseType(typeof(String))] 
    public HttpResponseMessage Save(HttpRequestMessage request, string point) 
    { 

    if (_usuarioValido == false) 
    { 
     return request.CreateResponse(HttpStatusCode.Conflict, "Fail user or password"); 
    } 

    return request.CreateResponse(HttpStatusCode.OK, url_completa.ToString()); 
    } 

ответ

0

Давайте попробуем это:

[HttpGet] 
[ResponseType(typeof(String))] 
public HttpResponseMessage Save(HttpRequestMessage request, string point) 
{ 
    ....... 
    if (_usuarioValido == false) 
    { 
     return request.CreateResponse(HttpStatusCode.Conflict, "Fail user or password"); 
    } 

    ....... 
    return request.CreateResponse(HttpStatusCode.OK, url_completa.ToString()); 
} 

Я не тестировал код выше, но примерно понятие есть.

Надеюсь, это поможет.

Спасибо!

+0

Большое спасибо за Ваш ответ я получаю серию ошибок, будучи переменные в другом контексте: _usuarioValido url_completa – user3923880

Смежные вопросы