//фильтр для валидации
public class ValidateModelAttribute: Attribute, IActionFilter
{
public bool AllowMultiple { get; } = false;
public Task<HttpResponseMessage> ExecuteActionFilterAsync(HttpActionContext actionContext,
CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation)
{
//примерно таким способом у меня все работает
if (!actionContext.ModelState.IsValid)
{
// получаем ошибки валидации по пути actionContext.ModelState[0..i].Error[0..j].ErrorMessage
var errors = (
from error in actionContext.ModelState
select new ErrorData("", error.Value.Errors[0].ErrorMessage) {Subject = error.Key}).ToArray();
throw new MyAwesomeValidationException("0x015", "Ошибка валидации") {ErrorData = errors};
}
return null;
}
}
//фильтр для ошибок
public class MyAwesomeExceptionFilterAttribute : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
var result = new ApiResult<ErrorData[]>() { Result = false };
var sp= actionExecutedContext.Exception as MyAwesomeException;
if (sp!= null)
{
result.Error = sp.Message;
result.ErrorCode = sp.Code;
result.Data = sp.ErrorData;
}
else
{
result.Error = actionExecutedContext.Exception.Message;
result.ErrorCode = "";
}
actionExecutedContext.Response = new HttpResponseMessage(HttpStatusCode.OK);
actionExecutedContext.Response.Content = new ObjectContent<ApiResult<ErrorData[]>>(result,new JsonMediaTypeFormatter());
}
}
class Events
{
public string ts { get; set; }
public string pts { get; set; }
public object[][] updates {get;set;}
}
...
Events events = JsonConvert.DeserializeObject<Events>(json);
var first = events.updates.FirstOrDefault(f=>f!=null&&f[0]=="First");//получение первого массива содержащего слово "First"
var text = events.updates.FirstOrDefault(f=>!(f!=null&&f.Any(a=>a=="Text")))//получение массива в котором есть "Text"
if(text==null)
throw new ArgumentException(...);
var textIndex = text.TakeWhile(w=>!(w=="Text")).Count();//получение индекса в массиве для слова "Text"
...
//пример для WebApi2:
//телеграм не дает возможности как-то проверять что запрос пришел от самого телеграма
//так что в официальном факе рекомендовано создавать сложный адрес
//так как такой адрес известен только разработчику и телеграму
//никто не сможет подделать запросы
[RoutePrefix("api/myveryawesomebot123802539483")]
public MyTelegramBotController:ApiController
{
[HttpPost]
[Route("sdfsdf2342f2q")]
public void Update([FromBody] UpdateModel model)
{
...
}
}
public class CommandResult
{
public string Command {get;set;}
}
public class CommandResult<T>:CommandResult
{
public T Data {get;set;}
}
public class FilesList
{
public string[] Files {get;set;}
}
public class UserInfo
{
...
}
public class MyAwesomeController:ApiController
{
public CommandResult<FilesList> GetFilesList(){
...
return new CommandResult<FilesList> (){
Command = "FilesList",
Data = new FilesList(){Files = new []{"file1","file2","file3","file4"}}
};
}
public CommandResult<UserInfo> GetUserInfo(){
...
}
}
public class MyAwesomeCommands
{
private CommandResult<FilesList> _getFilesList(){
...
return new CommandResult<FilesList> (){
Command = "FilesList",
Data = new FilesList(){Files = new []{"file1","file2","file3","file4"}}
};
}
public string GetFilesList(){
var data = getFilesList();
return JsonConvert.SerializeObject(data);
}
public string GetUserInfo(){
...
}
}
return new FormData(cbCOM?.SelectedItem?.ToString(), speed, tbSendText?.Text);
Заметки
Порядок байтов в массиве, возвращаемом методом GetBytes зависит от того, компьютерная архитектура элементов -, так и обратный порядок байтов.