标签: asp.net-web-api

使用Volley和没有HttpEntity工作POST多部分请求

这不是一个真正的问题,但是,我想在这里分享一些我的工作代码供您参考.

据我们所知,HttpEntityAPI22已弃用,自API23以来已完全删除.目前,我们无法再访问Android Developer上的HttpEntity Reference(404).因此,以下是我使用Volley和没有HttpEntity的POST多部分请求的工作示例代码.它正在运行,经过测试Asp.Net Web API.当然,代码可能只是发布两个现有可绘制文件的基本示例,也不是所有情况下的最佳解决方案,也不是很好的调优.

MultipartActivity.java:

package com.example.multipartvolley;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.v4.content.ContextCompat;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

import com.android.volley.NetworkResponse;
import com.android.volley.Response;
import com.android.volley.VolleyError;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;


public class MultipartActivity extends Activity {

    private final Context context = this;
    private final String twoHyphens = "--";
    private final String lineEnd = "\r\n";
    private final String boundary = …
Run Code Online (Sandbox Code Playgroud)

java android asp.net-web-api android-volley httpentity

103
推荐指数
3
解决办法
7万
查看次数

点字符'.' 在MVC Web API 2中请求诸如api/people/STAFF.45287之类的请求

我试图让工作的URL是以下风格的网址:http://somedomain.com/api/people/staff.33311(就像网站一样,LAST.FM允许在他们的RESTFul和WebPage网址中添加所有类型的标记例如," http://www.last.fm/artist/psy'aviah "是LAST.FM的有效网址.

以下方案有效: - http://somedomain.com/api/people/ - 返回所有人 - http://somedomain.com/api/people/staff33311 - 也可以,但不是我的意思在我希望网址接受"点"后,就像下面的示例 - http://somedomain.com/api/people/staff.33311 - 但这给了我一个

HTTP Error 404.0 - Not Found
The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.
Run Code Online (Sandbox Code Playgroud)

我已经设置了以下内容:

  1. 控制器"PeopleController"

    public IEnumerable<Person> GetAllPeople()
    {
        return _people;
    }
    
    public IHttpActionResult GetPerson(string id)
    {
        var person = _people.FirstOrDefault(p => p.Id.ToLower().Equals(id.ToLower()));
        if (person == null)
            return NotFound();
    
        return Ok(person);
    }    
    
    Run Code Online (Sandbox Code Playgroud)
  2. WebApiConfig.cs

    public static void Register(HttpConfiguration config)
    {
        // …
    Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc-routing asp.net-mvc-4 asp.net-web-api asp.net-web-api2

102
推荐指数
5
解决办法
5万
查看次数

无法使用Json在Web API中序列化响应

我正在使用ASP.NET MVC 5 Web Api.我想咨询我的所有用户.

我写了api/users,我收到了这个:

"'ObjectContent`1'类型无法为内容类型'application/json; charset = utf-8'"序列化响应正文

在WebApiConfig中,我已添加以下行:

HttpConfiguration config = new HttpConfiguration();
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; 
Run Code Online (Sandbox Code Playgroud)

但它仍然无效.

我的返回数据函数是这样的:

public IEnumerable<User> GetAll()
{
    using (Database db = new Database())
    {
        return db.Users.ToList();
    }
}
Run Code Online (Sandbox Code Playgroud)

c# asp.net json asp.net-web-api

102
推荐指数
9
解决办法
17万
查看次数

如何使用System.Net.HttpClient发布复杂类型?

我有一个自定义复杂类型,我想使用Web API.

public class Widget
{
    public int ID { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这是我的Web API控制器方法.我想像这样发布这个对象:

public class TestController : ApiController
{
    // POST /api/test
    public HttpResponseMessage<Widget> Post(Widget widget)
    {
        widget.ID = 1; // hardcoded for now. TODO: Save to db and return newly created ID

        var response = new HttpResponseMessage<Widget>(widget, HttpStatusCode.Created);
        response.Headers.Location = new Uri(Request.RequestUri, "/api/test/" + widget.ID.ToString());
        return response;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我想使用System.Net.HttpClient来调用该方法.但是,我不确定要传递给PostAsync方法的对象类型以及如何构造它.这是一些示例客户端代码.

var client …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-web-api

101
推荐指数
3
解决办法
20万
查看次数

在ASP.NET Web API中处理ModelState验证

我想知道如何使用ASP.NET Web API实现模型验证.我的模型是这样的:

public class Enquiry
{
    [Key]
    public int EnquiryId { get; set; }
    [Required]
    public DateTime EnquiryDate { get; set; }
    [Required]
    public string CustomerAccountNumber { get; set; }
    [Required]
    public string ContactName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后我在我的API控制器中有一个Post动作:

public void Post(Enquiry enquiry)
{
    enquiry.EnquiryDate = DateTime.Now;
    context.DaybookEnquiries.Add(enquiry);
    context.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

如何添加if(ModelState.IsValid)然后处理错误消息以传递给用户?

c# asp.net-web-api

100
推荐指数
6
解决办法
10万
查看次数

错误:请求标头字段Access-Control-Allow-Headers不允许Content-Type

我使用vS2012创建了一个mvc4 web api项目.我使用以下教程来解决跨源资源共享问题,"http://blogs.msdn.com/b/carlosfigueira/archive/2012/07/02/cors-support-in-asp-net-web-api- RC-version.aspx".它运行成功,我成功地将数据从客户端发布到服务器.

在我的项目中实现Autherization之后,我使用以下教程来实现OAuth2,"http://community.codesmithtools.com/CodeSmith_Community/b/tdupont/archive/2011/03/18/oauth-2-0-for -mvc两足-implementation.aspx".这有助于我在客户端获取RequestToken.

但是当我从客户端发布数据时,我得到了错误, "XMLHttpRequest无法加载http://.请求头字段Access-Control-Allow-Headers不允许Content-Type."

我的客户端代码看起来像,

 function PostLogin() {
    var Emp = {};            
    Emp.UserName = $("#txtUserName").val();             
    var pass = $("#txtPassword").val();
    var hash = $.sha1(RequestToken + pass);
            $('#txtPassword').val(hash);
    Emp.Password= hash;
    Emp.RequestToken=RequestToken;
    var createurl = "http://localhost:54/api/Login";
    $.ajax({
        type: "POST",
        url: createurl,
        contentType: "application/json; charset=utf-8",
        data: JSON.stringify(Emp),
        statusCode: {
                200: function () {
                $("#txtmsg").val("done");                       
                toastr.success('Success.', '');                         
                }
                },
        error:
            function (res) {                        
                toastr.error('Error.', 'sorry either your username of password was incorrect.');            
                }
        });
    };
Run Code Online (Sandbox Code Playgroud)

我的api控制器看起来像,

    [AllowAnonymous] …
Run Code Online (Sandbox Code Playgroud)

jquery cors oauth-2.0 asp.net-mvc-4 asp.net-web-api

100
推荐指数
5
解决办法
19万
查看次数

检测到实体框架自引用循环

我有一个奇怪的错误.我正在试验.NET 4.5 Web API,实体框架和MS SQL Server.我已经创建了数据库并设置了正确的主键和外键以及关系.

我创建了一个.edmx模型并导入了两个表:Employee和Department.一个部门可以有很多员工,这种关系存在.我使用scaffolding选项创建了一个名为EmployeeController的新控制器,以使用Entity Framework创建一个带有读/写操作的API控制器.在向导中,选择Employee作为模型,并选择数据上下文的正确实体.

创建的方法如下所示:

public IEnumerable<Employee> GetEmployees()
{
    var employees = db.Employees.Include(e => e.Department);
    return employees.AsEnumerable();
}
Run Code Online (Sandbox Code Playgroud)

当我通过/ api/Employee调用我的API时,出现此错误:

'ObjectContent`1'类型无法序列化内容类型'application/json的响应主体; ... ... System.InvalidOperationException","StackTrace":null,"InnerException":{"Message":"发生错误.","ExceptionMessage":"使用类型'System.Data.Entity.DynamicProxies检测到自引用循环.Employee_5D80AD978BC68A1D8BD675852F94E8B550F4CB150ADB8649E8998B7F95422552' .Path'[0] .Department.Employees'.","ExceptionType":"Newtonsoft.Json.JsonSerializationException","StackTrace":"...

为什么它自引用[0] .Department.Employees?这并没有多大意义.如果我在我的数据库中进行循环引用,我希望这会发生,但这是一个非常简单的例子.怎么可能出错?

c# serialization entity-framework-4 asp.net-web-api

100
推荐指数
10
解决办法
9万
查看次数

Web Api的Xml文档如何包含主项目之外的文档?

将XmlDoc集成到Web Api项目中的文档似乎只处理所有API类型都属于WebApi项目的情况.特别是,它讨论了如何将XML文档重新路由到App_Data/XmlDocument.xml取消注释配置中将使用该文件的行.这隐含地只允许一个项目的文档文件.

但是,在我的设置中,我在一个常见的"模型"项目中定义了我的请求和响应类型.这意味着如果我有一个端点,例如:

[Route("auth/openid/login")]
public async Task<AuthenticationResponse> Login(OpenIdLoginRequest request) { ... }
Run Code Online (Sandbox Code Playgroud)

OpenIdLoginRequest单独的C#项目中定义的位置如下:

public class OpenIdLoginRequest
{
    /// <summary>
    /// Represents the OpenId provider that authenticated the user. (i.e. Facebook, Google, etc.)
    /// </summary>
    [Required]
    public string Provider { get; set; }

    ...
}
Run Code Online (Sandbox Code Playgroud)

尽管有XML文档,但request在查看特定于端点的帮助页面(即http://localhost/Help/Api/POST-auth-openid-login)时,参数的属性不包含任何文档.

如何在Web API XML文档中显示具有XML文档的子项目中的类型?

c# xml-documentation asp.net-web-api

100
推荐指数
3
解决办法
3万
查看次数

使用HttpClient时记录请求/响应消息

我有一个方法,如下所示进行POST

var response = await client.PostAsJsonAsync(url, entity);

if (response.IsSuccessStatusCode)
{
        // read the response as strongly typed object
        return await response.Content.ReadAsAsync<T>();
}
Run Code Online (Sandbox Code Playgroud)

我的问题是如何获得从实体对象发布的实际JSON.我想记录获得POSTED的JSON,所以如果没有我必须自己进行json序列化,那将是很好的.

.net c# asp.net-mvc-4 asp.net-web-api

99
推荐指数
3
解决办法
7万
查看次数

请求的资源不支持HTTP方法'GET'

我的路线配置正确,我的方法有装饰标签.我仍然得到"请求的资源不支持HTTP方法'GET'"消息?

[System.Web.Mvc.AcceptVerbs("GET", "POST")]
[System.Web.Mvc.HttpGet]
public string Auth(string username, string password)
{
  // Décoder les paramètres reçue.
  string decodedUsername = username.DecodeFromBase64();
  string decodedPassword = password.DecodeFromBase64();

  return "value";
}
Run Code Online (Sandbox Code Playgroud)

这是我的路线:

config.Routes.MapHttpRoute(
    name: "AuthentificateRoute",
    routeTemplate: "api/game/authentificate;{username};{password}",
    defaults: new { controller = "Game",
                    action = "Auth", 
                    username = RouteParameter.Optional, 
                    password = RouteParameter.Optional },
    constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) }
);

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { controller = "Home", id = RouteParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)

c# routing asp.net-web-api

98
推荐指数
3
解决办法
12万
查看次数