我目前正在研究ASP.NET WebApi和Angularjs
WebApi有一个方法
[System.Web.Http.AcceptVerbs("POST")]
[System.Web.Http.HttpPost]
public HttpResponseMessage SearchAddress(SearchDetails searchDetail)
{
//13.03993,80.231867
try
{
if (!WebSecurity.IsAuthenticated)
{
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.NotAcceptable);
return response;
}
List<CollegeAddress> CollegeAddress = addressService.GetAddressFromDistance(17.380498, 78.4864948, 2000);
HttpResponseMessage responseData = Request.CreateResponse(HttpStatusCode.Accepted, CollegeAddress);
return responseData;
}
catch (Exception e)
{
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.NotFound);
return response;
}
}
Run Code Online (Sandbox Code Playgroud)
我必须从客户端调用此方法.
当我使用它调用此方法时Ajax,它不起作用,searchDetail如果我使用Ajax ,则method参数始终为null.
$.ajax({
method: 'POST',
url: rootUrl + '/api/Address/SearchAddress',
async: false,
data: searchDetail,
type: "json",
headers: {
'Content-Type': "application/json; charset=utf-8"
}
}).success(function (response) …Run Code Online (Sandbox Code Playgroud) 我有问题将此转换为vb.net
C#
Global.asax中
protected void Application_BeginRequest()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
}
public static void Register(HttpConfiguration config)
{
config.Routes.Clear();
}
Run Code Online (Sandbox Code Playgroud)
vb.net
Protected Sub Application_BeginRequest()
GlobalConfiguration.Configure(WebApiConfig.Register)
End Sub
Shared Function Register() As Action(Of HttpConfiguration)
End Function
Run Code Online (Sandbox Code Playgroud)
我在注册方法的vb.net版本中遇到问题.如何在c#中访问HttpConfiguration的参数.
我正在构建一个服务器监视系统,并希望向Web API发送请求并在JSON对象中获取服务器的运行状况,如果没有问题,数据库连接是否正常,响应时间等等.
如何实现响应时间,说明Web API响应请求需要多长时间?
我有像这样配置的路由:
routes.MapHttpRoute("DefaultApi2", "api/{controller}/{action}/{id}", new {id = RouteParameter.Optional}
Run Code Online (Sandbox Code Playgroud)
我的控制器看起来像这样:
public class RoutineController : ApiController
{
private readonly RoutineService _routineService;
public RoutineController(RoutineService routineService)
{
_routineService = routineService;
}
[HttpGet]
[ActionName("Tags")]
public List<RoutineTag> Tags()
{
return _routineService.GetAllTags();
}
[HttpGet]
[ActionName("SingleRoutine")]
// GET api/routine/5
public RoutineViewModel SingleRoutine(int id)
{
return _routineService.GetRoutineById(id);
}
}
Run Code Online (Sandbox Code Playgroud)
但是我收到了这个错误:
{"Message":"The request is invalid.","MessageDetail":"The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'Infrastructure.Api.Models.RoutineViewModel Routine(Int32)' in 'Infrastructure.Api.Controllers.RoutineController'. An optional parameter must be a reference …Run Code Online (Sandbox Code Playgroud) 我想知道是否可以使用多个Http属性来装饰WEB API控制器方法,如下所示,如果可能,这是表达该行为的正确方法吗?
例如:
[HttpPut]
[HttpPost]
public HttpResponseMessage EditRegistration([FromUri] string id, [FromBody] Registration registration)
Run Code Online (Sandbox Code Playgroud)
我试过这个并且管道在两种情况下都正确地解析了请求(PUT和POST请求)但是我想知道这是因为Http属性还是因为WEB API使用了一些其他方式将请求映射到控制器方法.
我刚刚将第一个C#WebAPI应用程序交付给第一个客户.在正常负载下,性能最初甚至比我预期的要好.原来.
一切都工作正常,直到某些时候,内存已经启动,垃圾收集开始乱成一团(如"它收集的物品还没有垃圾").那时,有多个W3WP线程,总共有10个ram,每个工人有一个单位数的演出.重新启动IIS后,一切都恢复正常,但当然内存使用率再次上升.
如果我错了,请纠正我,但是
请帮助我:
someBigList = null;要走的路?编辑:让我澄清一些事情.
我的.NET WebAPI应用程序主要是一堆
public class MyApiController:ApiController
{
[HttpGet]
public MyObjectClass[] MyApi(string someParam) {
List<MyObjectClass> list = new List<MyObjectClass>();
...
for/while/foreach {
MyObjectClass obj = new MyObjectClass();
obj.firstStringAttribute = xyz;
...
list.Add(obj);
}
return list.ToArray();
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,GC应该很简单:在"返回"之后,所有局部变量都应该是垃圾.然而,每次调用时,使用的内存都会增加.
我最初认为C#WebAPI程序的行为类似于(预编译)PHP:IIS调用程序,执行它,返回值,然后完全处理掉.
但这种情况并非如此.例如,我发现静态变量在运行之间保持数据,现在我处理了所有静态变量.
因为我发现静态变量是GC的一个问题:
internal class Helper
{
private static List<string> someVar = new List<string>();
internal Helper() {
someVar=new List<string>();
}
internal void someFunc(string str) {
someVar.Add(str);
}
internal string[] someOtherFunc(string str) …Run Code Online (Sandbox Code Playgroud) 我正在使用ASP.NET Web API创建一个可插拔的项目框架.我有很多胆量已经弄明白但是我对架构的一部分有问题,我不完全确定如何解耦.
作为简化示例,我有以下内容:
现在,服务都引用了Domain层,因为它有接口,帮助器等.但是,Domain层也引用了ASP.NET Web API 2.1等内容.我的想法是在域中有一个基础"BaseController",每个服务的控制器都可以从中继承,反过来都必然会继承像Get(),Post()等有线的东西.问题是我不希望每个服务都必须引用ASP.NET Web API 2.1和其他依赖项.我希望他们能够通过抽象来使用它们而不直接引用它们.换句话说,我想要更宽松的耦合,并希望服务能够自主地生活并独立于System.Web.Http.随着项目的发展,它将帮助我实施单元测试和SOLID原则.
也许我在这里采取了错误的方法,但也许不是.我的主要目标是使用ASP.NET Web API创建一个可插入的微服务框架,每个微服务都作为一个独立的程序集.所以,如果有另一种推荐方法,我会全力以赴.
希望这是有道理的.有什么指针吗?对于它的价值,我对设计模式和SOLID原则的概念非常熟悉; 只是不确定如何将这一切串在一起,同时保持控制器本身提供的一些自动请求处理.
谢谢!
我正在使用.NET 4上的Web API(nuget上的WebAPI版本4.0.30506)托管REST API.为了允许更精细的属性路由,我还在我的解决方案中包含了attributerouting.net.
我有2个冲突的属性路由.冲突的原因是我们在一次调用中通过字符串标识符查询,并在另一次调用中通过字符串操作+数字标识符进行查询.HTTP响应中抛出的消息读取Multiple actions were found that match the request.以下是演示这两者的示例查询:
1) http://example/api/libraries/?libraryId=some_library (some_library is a string identifier)
2) http://example/api/libraries/bookStatus/1 (1 is the library database ID)
Run Code Online (Sandbox Code Playgroud)
我一直在努力通过不同的方式来完成这项工作.我当前的控制器签名如下所示:
[GET("api/libraries/?libraryId={libraryId}", Precedence = 2)]
[System.Web.Http.HttpGet]
public Library QueryLibraryByLibraryId(string libraryId){}
[GET("api/libraries/bookStatus/{libraryId:long}", Precedence = 1)]
[System.Web.Http.HttpGet]
public Dictionary<string, Dictionary<string, string>> QueryBookStatus(long libraryId){}
Run Code Online (Sandbox Code Playgroud)
我可以看到为什么路由可能会混淆:它如何知道字符串标识符"bookStatus/1"无效是一个很好的问题.但是,我认为这应该更容易定义一些约束.
如何在保持此类签名结构的同时解决这些冲突?
我正在按照本教程讲解如何授权和从Web-api服务器获取承载令牌。通过fiddler在那里执行的任务非常简单,但是,当我尝试从控制台应用程序执行相同操作时,请求失败,并显示400 Bad Request Error。这是向服务器发出请求的代码:
var request = WebRequest.Create("http://localhost:12698/token") as HttpWebRequest;
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.CookieContainer = new CookieContainer();
var authCredentials = "userName=" + user + "&password=" + password;
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(authCredentials);
request.ContentLength = bytes.Length;
using (var requestStream = request.GetRequestStream()){
requestStream.Write(bytes, 0, bytes.Length);
}
using (var response = request.GetResponse() as HttpWebResponse){
authCookie = response.Cookies["access_token"];
}
Run Code Online (Sandbox Code Playgroud)
有人可以帮助我确定我在做什么错吗?还是我应该使用其他方法来获取身份验证令牌?
刚开始Star UML绘制一个class diagram.
与任何应用程序一样,MyBLL(业务层)Model在与DAO(数据库层)交互之后创建一个实例.
或多或少,简化(为清晰起见)类图如下所示:

很明显,BLL完成后将不再使用模型类.
我应该在这里使用什么?aggregation或composition映射MyBLL到MyModel.
我使用了一个composition从关系MyBLL到MyDAO.我的逻辑是在BLL图层存在之后,MyDAO将不再存在,因为它被引用MyBLL.它是否正确?
注意:这是WebAPI我使用C#创建的项目.
asp.net-web-api ×10
c# ×7
.net ×3
asp.net ×2
ajax ×1
angularjs ×1
architecture ×1
asp.net-mvc ×1
delegates ×1
http ×1
javascript ×1
memory-leaks ×1
staruml ×1
uml ×1
vb.net ×1