小编DGi*_*bbs的帖子

MVC中的500内部服务器错误页面

我正在尝试为MVC站点设置自定义错误.我有404页面工作正常,但在测试服务器错误时,我得到默认消息:

很抱歉,在执行您的要求时发生了一个错误.

而不是我的自定义页面.

我在web.config中设置了这个:

<customErrors mode="On"  defaultRedirect="~/Error/500">
    <error statusCode="404" redirect="~/Error/404" />
    <error statusCode="500" redirect="~/Error/500" />
</customErrors>
Run Code Online (Sandbox Code Playgroud)

我的错误控制器如下:

public class ErrorController : Controller
{
    [ActionName("404")]
    public ActionResult NotFound()
    {
        return View();
    }

    [ActionName("500")]
    public ActionResult ServerError()
    {
        return View();
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在500通过在我的一个视图中抛出异常来测试错误页面:

[ActionName("contact-us")]
public ActionResult ContactUs()
{
    throw new DivideByZeroException();
    return View();
}
Run Code Online (Sandbox Code Playgroud)

为什么只处理404错误?如何显示错误页面以查找500错误?

c# error-handling custom-errors asp.net-mvc-3

10
推荐指数
1
解决办法
2万
查看次数

HttpClient并设置授权标头

我正在尝试向Basecamp API提出一个简单的请求,我正在按照提供的说明添加示例用户代理和我的凭据,但我一直收到403 Forbidden回复.

我的凭据肯定是正确的,所以我的请求/凭据设置不正确的情况?

这就是我所拥有的(删除个人信息):

var httpClient = new HttpClient();
var content = new FormUrlEncodedContent(new[] { new KeyValuePair<string, string>("User-Agent", "MyApp [EMAIL ADDRESS]") });

httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
            Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(string.Format("{0}:{1}", "[USERNAME]", "[PASSWORD]"))));

var response = await httpClient.PostAsync("https://basecamp.com/[USER ID]/api/v1/projects.json", content);
var responseContent = response.Content;

using (var reader = new StreamReader(await responseContent.ReadAsStreamAsync()))
{
     Console.WriteLine(await reader.ReadToEndAsync());
}
Run Code Online (Sandbox Code Playgroud)

c# authentication httpclient

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

CA1023背后的原因是什么?

CA1023:索引器不应该是多维的

索引器(即索引属性)应使用单个索引.多维索引器可以显着降低库的可用性.如果设计需要多个索引,请重新考虑该类型是否表示逻辑数据存储.如果没有,请使用方法.

要修复违反此规则的行为,请将设计更改为使用单个整数或字符串索引,或使用方法而不是索引器.

这对我来说似乎很奇怪,为什么这会对任何事情产生重大影响?除了使多维索引更不直观之外?

Change the design to use a string?用它做什么?在另一端解析数字并失去强打字?

有人可以告诉我为什么多维索引器有问题吗?

c# code-analysis

8
推荐指数
1
解决办法
304
查看次数

将XML反序列化为对象 - XML文档中存在错误(0,0)

我正在尝试从简单的XML文档读取元素值并将它们绑定到一个对象,但是我遇到了我的XML文档的问题.我已经验证了它,并且可以确认文档本身没有问题,但是扩展了结果:

var nodes = from xDoc in xml.Descendants("RewriteRule")
                select xmlSerializer.Deserialize(xml.CreateReader()) as Url;
Run Code Online (Sandbox Code Playgroud)

显示"XML文档中存在错误(0,0)"

内部异常读取 <RewriteRules xmlns=''> was not expected.

我不确定我在这里做错了什么?

我的XML如下:

<?xml version="1.0" encoding="utf-8" ?>
<RewriteRules>
    <RewriteRule>
        <From>fromurl</From>
        <To>tourl</To>
        <Type>301</Type>
    </RewriteRule>
</RewriteRules>
Run Code Online (Sandbox Code Playgroud)

加载XML文件并尝试对其进行反序列化的代码: -

public static UrlCollection GetRewriteXML(string fileName)
{
    XDocument xml = XDocument.Load(HttpContext.Current.Server.MapPath(fileName));
    var xmlSerializer = new XmlSerializer(typeof(Url));

    var nodes = from xDoc in xml.Descendants("RewriteRule")
                select xmlSerializer.Deserialize(xml.CreateReader()) as Url;

    return nodes as UrlCollection;
}
Run Code Online (Sandbox Code Playgroud)

我的Url对象类: -

[Serializable]
[XmlRoot("RewriteRule")]
public class Url
{
    [XmlElement("From")]
    public string From { get; …
Run Code Online (Sandbox Code Playgroud)

.net c# xml serialization

7
推荐指数
1
解决办法
2万
查看次数

将Ajax工具包脚本移动到页面底部

我正在努力改善我们的一个网站PageSpeed见解得分,在我们徘徊的那一刻90,如果可能的话,我们想要进入90年代中期.

我们遇到的一个难点是,Ajax工具包脚本管理器正在页面顶部生成其脚本,谷歌将此标记为" 应该修复 "问题,并抱怨该脚本是渲染阻止,应该移动到页面底部或异步加载或通过defer属性加载.

我正在使用以下内容将我们的脚本合并到一个.js文件中以最小化请求:

<ajaxToolkit:ToolkitScriptManager ID="manScript" LoadScriptsBeforeUI="false" runat="server" EnableViewState="false" ScriptMode="Release">

    <CompositeScript ScriptMode="Release" Path="/CMSGlobalFiles/Js/combinedajax.min.js">
        <Scripts>
            <asp:ScriptReference Name="WebForms.js" Path="/CMSGlobalFiles/Js/aspnet/WebForms.js" Assembly="System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
            <asp:ScriptReference Name="MicrosoftAjax.js" Path="/CMSGlobalFiles/Js/aspnet/MicrosoftAjax.js"  />
            <asp:ScriptReference Name="MicrosoftAjaxWebForms.js" Path="/CMSGlobalFiles/Js/aspnet/MicrosoftAjaxWebForms.js" />
        </Scripts>
    </CompositeScript>

</ajaxToolkit:ToolkitScriptManager>
Run Code Online (Sandbox Code Playgroud)

有没有办法设置defer或获得输出asyncCompositeScript标签?或者将其移动到页面底部的任何其他方式?

我尝试过以下方法:

protected override void Render(HtmlTextWriter writer)
{
    StringWriter output = new StringWriter();
    base.Render(new HtmlTextWriter(output));

    string outputAsString = output.ToString();

    if(outputAsString.Contains("<script src=\"/CMSGlobalFiles/Js/combinedajax.min.js\" type=\"text/javascript\"></script>"))
    {
        outputAsString = outputAsString.Replace("<script src=\"/CMSGlobalFiles/Js/combinedajax.min.js\" type=\"text/javascript\"></script>", string.Empty);
    }

    writer.Write(outputAsString);
}
Run Code Online (Sandbox Code Playgroud)

然后手动在页面底部包含对脚本的引用:

<script …
Run Code Online (Sandbox Code Playgroud)

c# asp.net ajax ajaxcontroltoolkit

7
推荐指数
1
解决办法
538
查看次数

使用反射查找泛型方法时发现不明确的匹配

我正在使用反射来查找 Newtonsoft 的泛型方法,JsonConvert.DeserializedObject<T>但我发现它返回了非泛型版本的不明确匹配JsonConvert.DeserializeObject,这是尝试获取泛型方法的代码:

return typeof(JsonConvert).GetMethod("DeserializeObject", new Type[] { typeof(string) }).MakeGenericMethod(genericType);
Run Code Online (Sandbox Code Playgroud)

我已经指定我想要将 astring作为其唯一参数的方法,但泛型和非泛型版本都有匹配的参数列表,并且我收到了不明确的匹配错误。

是否可以通过GetMethod这种方式获得通用版本?我知道我可以使用 Linq 并GetMethods()找到它,例如:

var method = typeof(JsonConvert).GetMethods().FirstOrDefault(
            x => x.Name.Equals("DeserializeObject", StringComparison.OrdinalIgnoreCase) &&
            x.IsGenericMethod && x.GetParameters().Length == 1 &&
            x.GetParameters()[0].ParameterType == typeof(string));
Run Code Online (Sandbox Code Playgroud)

但这有点麻烦,一定有更好的方法。

c# generics reflection generic-method

6
推荐指数
2
解决办法
3292
查看次数

使用 Microsoft Graph 查询 AzureAD Graph 扩展属性

我正在从 Azure AD Graph API 迁移到 Microsoft Graph,因为它现已弃用。以前可以使用Microsoft.Azure.ActiveDirectory.GraphClient .GetExtendedProperties();调用来访问用户的扩展属性,例如:

var client = new ActiveDirectoryClient(serviceRoot, async () => await GetToken());
var user = await client.Users["user id..."].ExecuteAsync();
var properties = user.GetExtendedProperties();
Run Code Online (Sandbox Code Playgroud)

我需要使用 中的等效调用来复制此内容Microsoft Graph

我查看了schemaExtensions端点,例如:

获取所有扩展名:

/v1.0/schemaExtensions

但这似乎不会返回与 AD Graph 客户端相同的扩展数据。

使用 ext 获取用户:

v1.0/users/[user id]?$expand=extensions&$select=id,extension_[application id]_myExtension,onPremisesExtensionAttributes,displayName,jobTitle,identities

哪里extension_[application id]_myExtension有格式示例扩展:

extension_appid_extensionname

并且这不会返回用户的自定义扩展数据(但是其他属性工作正常)。

我们如何将扩展属性从 AD Graph 客户端迁移到 Microsoft Graph?

c# azure azure-active-directory azure-ad-graph-api microsoft-graph-api

5
推荐指数
1
解决办法
2168
查看次数

从 ReadAsStreamAsync 传递 Stream 作为 API 响应并避免占用大量内存对象

我正在使用两个 API,它们用于从外部系统下载大型文档。

我使用有关要检索的文档的一些信息调用 API 1,然后 API 1 使用充当“中间人”的相同信息调用 API 2。API 1 获取文档二进制文件,然后将其传递给原始调用者。

我想避免的是创建代表这些文档的大量内存对象,并仅传递一个流作为响应,这可以通过所描述的设置(“中间人”API)实现吗?

我所拥有的基本示例(在 API 1 中):

var request = new HttpRequestMessage(HttpMethod.Post, "https://example.com/api/getdocs");
request.Content = parameters;

// 'ResponseHeadersRead' - indicate completion on reading of headers and not entire response...
var response = await httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);

if (response.StatusCode == HttpStatusCode.OK)
{
     var stream = await response.Content.ReadAsStreamAsync();

     return this.Ok(stream);
}
else
{
    // Logging/error handling...
}
Run Code Online (Sandbox Code Playgroud)

原始调用者将其响应作为流读取,然后传递给FileStreamResult在客户端计算机上下载文档的 a。

我的问题:

  • var stream = await response.Content.ReadAsStreamAsync()行是否仍在创建一个代表文档的大内存对象?
  • 上面的流是否需要被处理,或者底层会HttpContent负责清理流吗?如果确实需要处理它,我该如何在仍然将流响应传递给调用者的同时执行此操作?(这可能吗?)

.net c# asp.net stream asp.net-core-webapi

5
推荐指数
1
解决办法
2018
查看次数

从HttpWebResponse获取重定向的URL的集合

我试图找回从代表所采取的路径URL列表URL XURL Y这里X可能会被重定向几次.

例如:

http://www.example.com/foo

这将重定向到:

http://www.example.com/bar

然后重定向到:

http://www.example.com/foobar

有没有办法从响应对象中获取此重定向路径作为字符串: http://www.example.com/foo > http://www.example.com/bar > http://www.example.com/foobar

我可以通过ResponseUrieg 获取最终的URL

public static string GetRedirectPath(string url)
{
    StringBuilder sb = new StringBuilder();
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    using (var response = (HttpWebResponse)request.GetResponse())
    {
        sb.Append(response.ResponseUri);
    }
    return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)

但这显然会在两者之间跳过URL.似乎没有一种简单的方法(或根本没有方法?)来获得完整的途径?

c# url redirect httpwebresponse

4
推荐指数
1
解决办法
6084
查看次数

转发器内部有多个更新面板触发器

我在转发器内部为项目创建触发器时遇到了一些麻烦.我想一个Linkbutton控件从更新面板中触发回发,我在标记中为Button控件定义了一个触发器,该工具正常工作:

<Triggers>
     <asp:PostBackTrigger ControlID="button" />
</Triggers>
Run Code Online (Sandbox Code Playgroud)

但是,LinkButton由于它们是动态创建的,我无法为s 执行此操作,只有解决方案是在我的repeater数据绑定事件中为每个按钮添加触发器,如下所示:

//Inside repeater itemdatabound...
var trigger = new PostBackTrigger();
trigger.ControlID = linkButton.UniqueID;
updatepanel.Triggers.Add(trigger);
Run Code Online (Sandbox Code Playgroud)

运行此代码时收到错误:

在UpdatePanel'updatepanel'中找不到ID为'ctl00 $ content $ repeater $ ctl01 $ linkBut​​ton'的控件.

如何为我的每个动态添加触发器LinkButtons

c# asp.net postback triggers updatepanel

3
推荐指数
1
解决办法
3890
查看次数