对于从Web API 2控制器返回,如果响应正常(状态200),我可以返回带有响应的内容,如下所示:
public IHttpActionResult Get()
{
string myResult = ...
return Ok(myResult);
}
Run Code Online (Sandbox Code Playgroud)
如果可能的话,我想在可能的情况下使用内置的结果类型:https://msdn.microsoft.com/en-us/library/system.web.http.results(v = vs.118).aspx
我的问题是,对于另一种类型的响应(不是200),如何用它返回消息(字符串)?例如,我可以这样做:
public IHttpActionResult Get()
{
return InternalServerError();
}
Run Code Online (Sandbox Code Playgroud)
但不是这个:
public IHttpActionResult Get()
{
return InternalServerError("Message describing the error here");
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,我希望将其推广,以便我可以使用IHttpActionResult的任何实现发回消息.
我是否需要这样做(并构建我自己的响应消息):
public IHttpActionResult Get()
{
HttpResponseMessage responseMessage = ...
return ResponseMessage(responseMessage);
}
Run Code Online (Sandbox Code Playgroud)
或者,还有更好的方法?
为了使用Web API帮助页面为我的Web API项目生成XML文档,我必须检查项目属性的"构建"部分下的"XML文档文件"选项.这在我本地构建时正确生成了文档.
但是,当我签入时,我在构建服务器上收到以下错误:
CSC:生成XML文档文件'c:\ Builds\3 ...\Sources\CurrentVersion ...\ProjectName\App_Data\XmlDocument.xml'时出错('访问被拒绝.')
我不确定为什么会这样,因为它无论如何都会为每个构建创建一个新目录.我搜索了这个问题并搜索了Stack Overflow,但我找到的唯一解决方案是删除XML文档文件(这违背了使用Web API帮助页面的目的).我该如何解决这个问题?
xml msbuild visual-studio asp.net-web-api asp.net-web-api-helppages
假设我有一个存储在这样的变量中的查询(它实际上是动态填充的,而且更复杂,但这是出于演示目的):
DECLARE @Query VARCHAR(1000) = 'SELECT * FROM dbo.MyTable'
Run Code Online (Sandbox Code Playgroud)
有没有办法检查查询是否会返回任何结果?像这样的东西,但这不起作用:
IF EXISTS (@Query)
BEGIN
-- do something
END
Run Code Online (Sandbox Code Playgroud)
我能想到的唯一方法是将结果放在临时表中,然后从中查询,但这并不理想,因为动态查询中的列可能会有所不同,我真的不需要临时表除了检查是否会返回某些行之外的任何原因.有没有更好的办法?
我正在尝试创建一个Web API,允许API的客户端(本机移动应用程序)使用第三方云存储提供程序登录.我正在使用Microsoft的以下一般流程:

这是我想要实现的目标:

我使用带有外部身份验证的默认ASP.NET Web API Visual Studio模板,以及用于Dropbox登录功能的OWin.Security.Providers Nuget包,以及用于Google(Drive)和Microsoft(OneDrive)的现有内置登录功能.
我遇到的问题是,内置功能似乎都是作为一个流程的一部分进行身份验证和授权.例如,如果我在Startup.Auth.cs中设置以下内容:
DropboxAuthenticationOptions dropboxAuthOptions = new DropboxAuthenticationOptions
{
AppKey = _dropboxAppKey,
AppSecret = _dropboxAppSecret
};
app.UseDropboxAuthentication(dropboxAuthOptions);
Run Code Online (Sandbox Code Playgroud)
...并从我的网络浏览器导航到此网址:
http://<api_base_url>/api/Account/ExternalLogin?provider=Dropbox&response_type=token&client_id=self&redirect_uri=<api_base_url>
Run Code Online (Sandbox Code Playgroud)
我已成功重定向到Dropbox登录:
https://www.dropbox.com/1/oauth2/authorize?response_type=code&client_id=<id>&redirect_uri=<redirect_uri>
Run Code Online (Sandbox Code Playgroud)
...然后在我授予访问权限后,重定向回到:
http://<api_base_url>/Help#access_token=<access_token>&token_type=bearer&expires_in=1209600
Run Code Online (Sandbox Code Playgroud)
...因为你可以看到令牌是其中的一部分,所以可以提取.问题是客户端需要导航到Dropbox并将授权代码返回到Web API,Web API会将授权代码发送回第三方以获取令牌,然后将其返回给客户......如上图所示.我需要AccountController中的ExternalLogin操作以某种方式检索Dropbox url并将其返回给客户端(它只是一个json响应),但我没有看到一种方法来检索它(它只返回一个ChallengeResult,并且实际的Dropbox网址埋在某处).此外,我认为我需要一种方法来根据授权代码单独请求来自第三方的令牌.
这篇文章似乎与我想要做的有点类似:
使用OWIN标识从多个API客户端注册Web API 2外部登录
...但是那里的解决方案似乎要求客户端成为MVC应用程序,对我来说不一定是这样.我希望在客户端保持尽可能简单,遵循上图中的流程,但也不要重新发明轮子(尽可能多地重用OWIN/OAuth2实现中已存在的内容).理想情况下,我不希望客户端必须引用任何OWIN/OAuth库,因为我真正需要客户端做的就是访问API提供的外部URL(在我的示例中为Dropbox),让用户输入他们的凭据并授予权限,并将生成的授权代码发送回api.
从概念上讲,这听起来并不难,但我不知道如何实现它,仍然尽可能多地使用现有的OAuth代码.请帮忙!
我试图从客户端发布到Web API方法,如下所示:
// Create list of messages that will be sent
IEnumerable<IMessageApiEntity> messages = new List<IMessageApiEntity>();
// Add messages to the list here.
// They are all different types that implement the IMessageApiEntity interface.
// Create http client
HttpClient client = new HttpClient {BaseAddress = new Uri(ConfigurationManager.AppSettings["WebApiUrl"])};
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
// Post to web api
HttpResponseMessage response = client.PostAsJsonAsync("Communications/Messages", messages).Result;
// Read results
IEnumerable<ApiResponse<IMessageApiEntity>> results = response.Content.ReadAsAsync<IEnumerable<ApiResponse<IMessageApiEntity>>>().Result;
Run Code Online (Sandbox Code Playgroud)
我的Web API控制器操作如下所示:
public HttpResponseMessage Post([FromBody]IEnumerable<IMessageApiEntity> messages)
{
// Do stuff
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,messages当进入Web …
我是一名C#/ .NET开发人员,但对Excel编程或VBA不太熟悉.对于辅助项目,我有一个电子表格,非技术用户将使用该电子表格进行数据输入.稍后,这个电子表格将通过我编写的C#命令行程序导出为不同的格式,以便可以将数据转储到不同的系统中.
我需要准确输入数据值,就像命令行程序所期望的那样,因此由于拼写错误或轻微的措辞差异而导致的用户错误将是有问题的.我需要用户从可能的值中进行选择,而不是依赖于用户输入正确的值.
对于只能在单元格中具有单个值的列,我可以通过使用用户可以选择的下拉菜单来完成此操作.我是通过这里的说明做到的:
http://office.microsoft.com/en-us/excel-help/insert-or-delete-a-drop-down-list-HP010072599.aspx
问题是,我有几个列,其单元格可以包含多个值,以逗号分隔.例如,我有一个"颜色"列.该列中的单元格的值可以是单色(例如"红色")或由逗号分隔的颜色列表(例如"红色,绿色,蓝色").理想情况下,我希望用户能够单击单元格并查看复选框列表,从中可以选择颜色,完成后,单元格将使用逗号分隔的颜色进行更新.
完成此任务的最佳方法是什么?我试过谷歌搜索,发现这个方法:
http://www.contextures.com/excel-data-validation-multiple.html
...允许从下拉菜单中选择多个项目,但这很不方便,因为每次需要添加其他项目时都必须重新打开下拉列表.复选框会更方便.这是可能的,如果是的话,怎么样?
我已经搜索过,但没有找到明确的答案。以下哪个对 SQL Server 的性能更好:
SELECT T.*
FROM dbo.Table1 T
LEFT JOIN Table2 T2 ON T.ID = T2.Table1ID
LEFT JOIN Table3 T3 ON T.ID = T3.Table1ID
WHERE T2.Table1ID IS NOT NULL
OR T3.Table1ID IS NOT NULL
Run Code Online (Sandbox Code Playgroud)
或者...
SELECT T.*
FROM dbo.Table1 T
JOIN Table2 T2 ON T.ID = T2.Table1ID
UNION
SELECT T.*
FROM dbo.Table1 T
JOIN Table3 T3 ON T.ID = T3.Table1ID
Run Code Online (Sandbox Code Playgroud)
我试过同时运行两者,但很难确定。我很感激解释为什么一个比另一个更快,或者这取决于具体情况。
我在单个文件中有一堆长json输出.我需要读取这些文件并将它们反序列化为最初生成json的实体(我可以访问原始实体).每个文件都有通过序列化类型对象生成的json输出IEnumerable<Response<MyEntity>>.
我试图反序列化时遇到异常,但我不明白为什么.这是我尝试反序列化:
List<string> jsonOutputStrings;
// Read json from files and populate jsonOutputStrings list
List<Response<MyEntity>> apiResponses = new List<Response<MyEntity>>();
foreach (string json in jsonOutputStrings)
{
apiResponses.AddRange(JsonConvert.DeserializeObject<List<Response<MyEntity>>>(json, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }).ToList());
}
Run Code Online (Sandbox Code Playgroud)
我也尝试反序列化到IEnumerable而不是列表:
apiResponses.AddRange(JsonConvert.DeserializeObject<IEnumerable<Response<MyEntity>>>(json, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }).ToList());
Run Code Online (Sandbox Code Playgroud)
我得到以下异常:
Newtonsoft.Json.dll发生了'Newtonsoft.Json.JsonSerializationException'类型的第一次机会异常
附加信息:无法创建和填充列表类型System.Linq.Enumerable + WhereSelectListIterator`2 [Entities.Requirement,Entities.RequirementEntity].路径'$ values [0] .ReturnedEntity.Summaries.$ values [0] .Requirements.$ values',line 1,position 715.
整个json太长而无法发布(并且还包含一些机密数据)但我确实在json中找到了一个包含此内容的地方:
"Requirements":{"$id":"7","$type":"System.Linq.Enumerable+WhereSelectListIterator`2[[Entities.Requirement, Entities],[Entities.RequirementEntity, API.Entities]], System.Core","$values":[...]}
Run Code Online (Sandbox Code Playgroud)
在我试图反序列化的实体(最初被序列化的那个)中,Requirements是类型的IEnumerable<Entities.RequirementEntity>.
对我来说,序列化是如何MyEntity起作用而反序列化到同一类型却没有意义.我该如何解决这个问题?
据我所知,Factory Method比Simple Factory的主要优点之一是它不违反Open-Closed SOLID原则.也就是说,前者不需要在添加新类型时修改switch语句.
有一件我希望得到澄清.如果我要使用一个简单的工厂,我会有一个像这样的工厂(简化):
public class ObjectFactory {
public static IObject CreateObject(ObjectTypeEnum objectType) {
switch (objectType) {
case TypeA:
return ObjectA;
break;
case TypeB:
return ObjectB;
break;
case TypeC:
return ObjectC;
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
并且客户端会这样称呼它:
IObject myObject = ObjectFactory.CreateObject(objectType);
Run Code Online (Sandbox Code Playgroud)
文献中的缺点是在添加新对象类型时需要修改CreateObject.
但是使用Factory方法,我们不会将此修改从工厂移动到客户端,就像这样(客户端代码):
IObject myObject;
switch (objectType) {
case TypeA:
myObject = ObjectAFactory.CreateObject();
break;
case TypeB:
myObject = ObjectBFactory.CreateObject();
break;
case TypeC:
myObject = ObjectCFactory.CreateObject();
break;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,每次添加新类型时都需要修改客户端,而在之前的情况下需要修改工厂.那么一个优于另一个的优势是什么?请不要将此标记为重复,我已经查看了很多关于工厂的SO帖子,没有一个解决这个特定的区别.
是否有更好的解决方案不会违反客户或工厂方面的开放/封闭原则?
design-patterns factory factory-pattern open-closed-principle solid-principles
我正在将Web API帮助页面与Web API 2(5.0)一起使用-均为最新的Nuget软件包。我希望帮助文档在HttpResponseMessage的正文中显示作为参数或返回的类的属性的注释。
例如,我有一个像这样的控制器方法:
public HttpResponseMessage Post([FromBody] MyClassType1 myClass)
{
// Business logic removed for clarity
return Request.CreateResponse(HttpStatusCode.OK, new MyClassType2());
}
Run Code Online (Sandbox Code Playgroud)
我想要上面发布操作的XML注释,MyClassType1并将MyClassType2其显示在帮助页面上。
我看过的所有地方,到目前为止似乎还不支持。但是,我想知道是否有人能够通过扩展ApiExplorer,添加到XmlDocumentationProvider等使它正常工作?
我知道注释和属性包含在生成的XML文件中,因此我可以尝试手动解析(所有参数和返回类型都在MyAssemblyName.Models名称空间中,因此我想我可以查找具有但是,我知道内置的Web API帮助页面具有某些缓存功能,因此,我宁愿以某种方式将其与现有功能合并(只需对其进行添加)。
通过将Parameters.cshtml模板更新为以下内容,我设法显示了参数的类型(仅向下一层):
@using System.Reflection
@using System.Threading
@using System.Web.Http.Description
@using Regency.API.Services.Areas.HelpPage
@model System.Collections.ObjectModel.Collection<ApiParameterDescription>
<table class="help-page-table">
<thead>
<tr><th>Name</th><th>Properties</th><th>Description</th><th>Additional information</th></tr>
</thead>
<tbody>
@foreach (ApiParameterDescription parameter in Model)
{
string parameterDocumentation = parameter.Documentation ?? "No documentation available.";
Type parameterType = parameter.ParameterDescriptor.ParameterType;
// Don't show CancellationToken because it's a special parameter
if (!typeof (CancellationToken).IsAssignableFrom(parameter.ParameterDescriptor.ParameterType)) …Run Code Online (Sandbox Code Playgroud) c# asp.net-mvc asp.net-web-api asp.net-mvc-apiexplorer asp.net-web-api-helppages
我是C#编程的新手.我正在阅读ac#book并且无法解释代码.具体来说,{0}和my_double如何在下面工作?
my_double = 3.14;
my_decimal = 3.14;
Console.WriteLine("\nMy Double: {0}", my_double);
Run Code Online (Sandbox Code Playgroud)
我在书中已多次看过这种格式,但尚未解释.我知道它正在写这个到控制台窗口,但我的问题是:
我需要一种方法,通过Web API向ASP.NET Web API的客户端(C#应用程序)通知某些更改.他们甚至不需要知道更改是什么,只需要获得更改的通知(此时由客户端调用API以获取他们在获取通知后可能需要的任何特定数据).我不确定实现这一目标的好方法是什么样的.
我想一种方法可能是创建事件,并以某种方式让客户端订阅这些事件,但我不知道如何通过Web API这样做.
我在Google上发现了一些SignalR的提及,但这似乎需要付出很多努力,而且似乎比我需要做的更多.
我所需要的只是让Web API能够告诉客户"改变了一些东西,来得到它".但是,我想避免投票.最快/最简单的方法是什么?
我需要从我的Web API 2控制器调用外部api,类似于此处的要求:
使用Web API Action中的HttpClient调用外部HTTP服务
但是,上面的解决方案需要将async关键字添加到我的api方法的GET调用中,从而使我的调用异步.我更喜欢用同步方法呈现我的API的客户端,但仍然可以从我自己调用外部api(并且需要在我的api返回之前返回).有没有办法做到这一点?
c# ×7
asp.net ×2
asp.net-mvc ×2
sql ×2
sql-server ×2
web-services ×2
async-await ×1
asynchronous ×1
events ×1
excel ×1
excel-2007 ×1
excel-vba ×1
exists ×1
factory ×1
httpresponse ×1
json ×1
json.net ×1
left-join ×1
linq ×1
msbuild ×1
oauth ×1
oauth-2.0 ×1
owin ×1
performance ×1
union ×1
vba ×1
xml ×1