我正在构建一个.NET WebApi项目.我的一个ApiControllers返回一个数据表.在JSON格式中,它看起来都很好,但XML格式包含我不需要的垃圾.
所以,我在想,让我们编写自己的XML序列化.为此,我创建了一个实现IXmlSerializable的新类.它看起来像这样:
public class MyDataTable : IXmlSerializable
{
public MyDataTable(DataTable datatable)
{
this.Data = datatable;
}
public void WriteXml(XmlWriter writer)
{
writer.WriteStartElement("Test");
writer.WriteElementString("T", "hello world");
writer.WriteEndElement();
}
public XmlSchema GetSchema()
{
return null;
}
public void ReadXml(XmlReader reader)
{
throw new NotImplementedException();
}
public DataTable Data { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在我的XML看起来很棒,但我的JSON不是.JSON看起来像:
{"Data":[{"id":1,"name":"John"},{"id":2,"name":"Julia"}]}
Run Code Online (Sandbox Code Playgroud)
我真正想要的是这个:
[{"id":1,"name":"John"},{"id":2,"name":"Julia"}]
Run Code Online (Sandbox Code Playgroud)
有没有一种简单的方法可以从JSON结果中删除"Data"字符串,而无需重写整个内容?或者是否有比这更好的解决方案?
首先我读了很多关于这个主题的文章,并安装了几个"路由调试"插件.我对Java/Spring比较熟悉,所以我真的不知道如何调试这个东西,使用vs 2012.(我无论如何都不能让IISExpress打印任何调试,而不是我习惯使用Spring/Tomcat的那种调试输出.)
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Legal",
action = "Index",
id = UrlParameter.Optional }
);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我可以通过默认控制器点击索引页面.但是,我试图基于以下控制器点击URL/WebApi/Metadata /:
[BreezeController]
public class WebApiController : ApiController {
private readonly EFContextProvider<BankruptcyDbContext> _contextProvider =
new EFContextProvider<BankruptcyDbContext>();
[HttpGet]
public string Metadata() {
return _contextProvider.Metadata();
}
}
Run Code Online (Sandbox Code Playgroud)
"Route Debugger"表示我对/ WebApi/Metadata,/ WebApi/Metadata /,/ WebApi/Metadata/0等的请求应该"匹配",但我得到的只是404.
Edit1:我终于找到了跟踪日志并获得了更多细节:
The controller for path &#39;/WebApi/Metadata&#39; was not found or does not implement IController
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 microsoft graph api 作为应用程序访问组日历(我不想使用委托权限)。
如果我使用下面的方法请求日历事件,我就能很好地为用户获取事件。
https://graph.microsoft.com/v1.0/users/[emailAddress]/events
Run Code Online (Sandbox Code Playgroud)
如果我向以下人员提出请求,我会获得组信息:
https://graph.microsoft.com/v1.0/groups/[groupId]/
Run Code Online (Sandbox Code Playgroud)
如果我对此提出请求:
https://graph.microsoft.com/v1.0/groups/[groupId]/events
Run Code Online (Sandbox Code Playgroud)
我收到“访问被拒绝。检查凭据并重试。” 在azure门户中,我已向我的应用程序服务授予以下应用程序权限:
Calendars.Read
Calendars.Read.Shared
Group.Read.All
User.Read.All
Run Code Online (Sandbox Code Playgroud)
我缺少什么?
我想运行我的应用程序的多个副本,并强制第一个在一个监视器上打开,第二个实例在第二个监视器上打开
我有一个我正在研究的ASP.NET WebApi项目.老板希望返回支持"部分响应",这意味着尽管数据模型可能包含50个字段,但客户端应该能够为响应请求特定字段.原因是如果他们实现例如列表他们根本不需要所有50个字段的开销,他们可能只想要名字,姓氏和Id来生成列表.到目前为止,我已经使用自定义合约解析器(DynamicContractResolver)实现了一个解决方案,这样当请求进入时,我通过OnActionExecuting方法中的过滤器(FieldListFilter)窥视它,并确定是否有一个名为"FieldList"的字段
一些示例代码
DynamicContractResolver.cs
protected override IList<JsonProperty> CreateProperties(Type type, Newtonsoft.Json.MemberSerialization memberSerialization)
{
List<String> fieldList = ConvertFieldStringToList();
IList<JsonProperty> properties = base.CreateProperties(type, memberSerialization);
if (fieldList.Count == 0)
{
return properties;
}
// If we have fields, check that FieldList is one of them.
if (!fieldList.Contains("FieldList"))
// If not then add it, FieldList must ALWAYS be a part of any non null field list.
fieldList.Add("FieldList");
if (!fieldList.Contains("Data"))
fieldList.Add("Data");
if (!fieldList.Contains("FilterText"))
fieldList.Add("FilterText");
if (!fieldList.Contains("PageNumber"))
fieldList.Add("PageNumber");
if (!fieldList.Contains("RecordsReturned"))
fieldList.Add("RecordsReturned");
if (!fieldList.Contains("RecordsFound"))
fieldList.Add("RecordsFound");
for (int ctr …Run Code Online (Sandbox Code Playgroud) 我通过nuget将ASP.NET 4 Web API帮助页面包安装到我的Web Api项目中.由于某种原因,它不会显示所有api端点.我有文档设置使用XML.不知道为什么会这样,任何帮助表示赞赏.
这是一个示例控制器
public class ProductController : BaseController
{
// GET api/Product/Get/5/43324
[AcceptVerbs("GET")]
public ApiProduct Get(int id, [FromUri]int productId)
{
//// logic
}
}
Run Code Online (Sandbox Code Playgroud)
路线
config.Routes.MapHttpRoute(
name: "api-info",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional, action = RouteParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)
谢谢
我正在使用HttpClient,我需要设置非标准类型HttpMethod.如果使用HttpWebRequest只需要一个字符串,那么HttpClient期望一个HttpMethod.枚举可用值HttpMethod,我没有看到添加自定义值的方法.有什么想法吗?
当我在控制台应用程序中调用下面的函数时,它只是工作.但是当我将它添加到MVC控制器时,执行永远不会到达JsonConvert行.任何想法,我错过了什么.
调用代码
GetVersion(url).Result.FileVersion
Run Code Online (Sandbox Code Playgroud)
方法
public static async Task<Version> GetVersion(string url, string hostHeader)
{
var client = new HttpClient();
if (!string.IsNullOrEmpty(hostHeader))
{
client.DefaultRequestHeaders.Host = hostHeader;
}
var version = await client.GetStringAsync(url);
var output = JsonConvert.DeserializeObject<Version>(version);
client.Dispose();
return output;
}
Run Code Online (Sandbox Code Playgroud) 我有一个循环遍历一个简短的列表,URIs需要发送每个相同的内容.它HttpContent驻留在传递给调用的变量中PostAsync.我遇到的问题是第一次调用工作正常,但所有后续调用都失败,因为请求内容是null在第一次调用完成之后.
我认为我对PostAsync封面下的电话的理解可能缺乏对象的一些低级细节,而且它的生命周期(或缺乏),所以希望有人可以为我阐明它.
代码如下:
HttpResponseMessage httpResponseMessage = httpClient.PostAsync(destionationUri, messageContent).Result;
Run Code Online (Sandbox Code Playgroud)
有问题的变量是从中衍生出来messageContent的类型.我想一些将值复制到一个新的独立位置以供重用的粗暴方法可能会起作用,但我希望了解为什么会发生这种情况以及允许内容在循环期间保持不变的正确方法.MultipartFormDataContentHttpContent
有谁知道我如何解决这个问题,并在循环上面的代码时,messageContent值将在迭代之间持续存在?
编辑:我继续和重构的代码重建的MultipartFormDataContent使用之前,每次调用相同的数据从头开始PostAsync使用新的实例HttpClient.重建HtppContent实际工作的呼吁; 该值不为null.但是,当我现在去进行后续调用PostAsync和访问时,.Result我收到以下错误:
将内容复制到流时出错.无法访问封闭的Stream.
编辑2:在检查第二次调用我的方法MultipartFormDataContent从头开始重建对象时,我注意到我的附件属性在检查它的ContentStream属性(Mail.MailMessage对象)时声明如下:
attachment.ContentStream.Position抛出了类型的异常
System.ObjectDisposedException
所有属性都表明ContentStream无法再读取它,因为它已被丢弃.呼吁PostAsync().Result显然是处理流并且可能是根本问题.但是我仍然无法找到可行的解决方案.
我正在尝试使用 Microsoft Graph API 从 SharePoint 文档库获取文件夹和文档。
\n\n如果我请求GET,https://graph.microsoft.com/v1.0/sites/mysite.sharepoint.com:/sites/MyDocumentSite:/drives/我会得到这个:
{\n "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#drives",\n "value":[\n {\n "createdDateTime": "2019-09-05T07:09:49Z",\n "description": "",\n "id": "b!wxh2ZWwoT0KKTdLRYjD5jvzjo8jkat5LgY3VyfgEqkv3YVg_XXXXXXXXXXXXXXXX",\n "lastModifiedDateTime": "2019-09-05T07:09:49Z",\n "name": "Documents",\n "webUrl": "https://mysite.sharepoint.com/sites/MyDocumentSite/Shared%20Documents",\n "driveType": "documentLibrary",\n "createdBy":{"user":{"displayName": "System Account" }},\n "lastModifiedBy":{"user":{"email": "me@myorganization.org", "id": "73f9990c-5c92-4839-8b13-XXXXXXXXXXXX", "displayName": "John Smith"\xe2\x80\xa6},\n "quota":{"deleted": 0, "remaining": 0, "total": 0, "used": 0}\n }\n ]\n}\nRun Code Online (Sandbox Code Playgroud)\n\n但是,如果我尝试通过GET对该 id: 执行请求来访问该驱动器https://graph.microsoft.com/v1.0/sites/mysite.sharepoint.com:/sites/MyDocumentSite:/drives/b!wxh2ZWwoT0KKTdLRYjD5jvzjo8jkat5LgY3VyfgEqkv3YVg_XXXXXXXXXXXXXXXX,则会收到 BadRequest 错误:
{\n "error":{\n "code": "BadRequest",\n "message": "Url specified is invalid.",\n "innerError":{\n "request-id": "7c9eaf61-764f-4d72-abdb-ffa2fe868e90",\n "date": "2019-09-16T19:09:41"\n }\n …Run Code Online (Sandbox Code Playgroud) c# ×5
.net ×2
asp.net-mvc ×2
breeze ×1
datatable ×1
http-method ×1
http-post ×1
json ×1
json.net ×1
sharepoint ×1