小编chi*_*oro的帖子

如何在不引用Form的情况下使用ISynchronizeInvoke

我需要从另一个线程(Excel Interop)"发送"一段代码到UI线程来执行.通常情况下,你会使用InvokeForm,它实现了ISynchronizeInvoke接口:

public class MyForm : Form
{
    ...
    private void Button_Click(object sender, EventArgs e)
    {
        SomeExcelWorkbook.OnBeforeClose += delegate(ref bool Cancel)
        {
            this.Invoke(someCode);
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,在表单代码和定义事件处理程序的代码之间有一层抽象,我在那时没有对表单的引用:

public void CodeExecutedByUIThread()
{
    ISynchronizeInvoke sync;
    SomeExcelWorkbook.OnBeforeClose += delegate(ref bool Cancel)
    {
        sync.Invoke(someCode);
    };
}
Run Code Online (Sandbox Code Playgroud)

进入时CodeExecutedByUIThread,我们仍处于UI线程中,因此理论上所需的一切都应该存在.不幸的是,Form是实现该接口的唯一类,是吗?

如何ISynchronizeInvoke从UI线程中获取?显然Thread.CurrentThread不提供它......

或者有办法获得SynchronizationContext?我该如何检索和使用它?

更新:哦,我明白了,获取SynchronizationContext对象看起来很简单SynchronizationContext.Current,不需要对表单进行任何引用.因此,我会更多地了解如何使用它.

c# multithreading .net-3.5

6
推荐指数
1
解决办法
3314
查看次数

ASMX Web服务允许匿名访问

我遇到了我开发的asmx Web服务的授权错误.Web服务本身不需要任何用户凭据,但似乎Web服务配置为强制执行,尽管我尝试设置配置以允许匿名访问:

我在IIS中设置了相应的网站以允许匿名访问:

IIS设置的屏幕截图

此外,我在以下内容中包括以下内容web.config:

<configuration>
    ...
    <system.web>
        ...
        <authorization>
            <allow users="*"/>
        </authorization>
        ...
    </system.web>
    ...
</configuration>
Run Code Online (Sandbox Code Playgroud)

当尝试从测试客户端调用Web服务时,我收到以下错误消息:

HTTP请求未经授权,客户端身份验证方案为"匿名".从服务器收到的身份验证标头是"NTLM".

调用Web服务的代码行如下所示:

string message = new ServiceReference1.Service1SoapClient().HelloWorld();
Run Code Online (Sandbox Code Playgroud)

和Web服务的代码:

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class Service1 : System.Web.Services.WebService
{
    [WebMethod]
    public string HelloWorld()
    {
        return "Hello World";
    }
}
Run Code Online (Sandbox Code Playgroud)

一些要点:

  • 如果我尝试将客户端设置为使用NTLM进行身份验证,则可以正常工作.
  • 如果我尝试将客户端设置为不进行身份验证,则会因上面的消息而失败.
  • 如果我尝试使用Web浏览器访问Web服务,我还会收到FORBIDDEN错误消息,而不是预期的Web服务文档页面.
  • 如果我从Visual Studio中运行Web服务并配置客户端访问该服务(localhost ...),它可以正常工作.
  • 有关详细信息,请参见下文

我还尝试将授权标记放在指向Web服务的位置标记中:

<location path="Service1.asmx">
    <system.web>
        <authorization>
            <allow users="*" />
        </authorization>
    </system.web>
</location>
Run Code Online (Sandbox Code Playgroud)

这就是客户端配置(app.config)的样子(请注意,如上所述,我甚至无法使用Web浏览器访问该服务,因此我不认为客户端配置相关):

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding> …
Run Code Online (Sandbox Code Playgroud)

asp.net authentication web-services asmx

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

检查文本的jquery验证不包含html

如何执行jquery验证以检查textarea是否不包含html标签?(如果错误的话)

(顺便说一句,我阻止html在服务器上通过)

javascript validation jquery

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

WCF DataService不支持预检OPTIONS请求?

我想使用基于ajax的组件(KendoUI)来读取/修改由WCF DataServices实现的OData端点上的实体.

首先,服务实现相当容易:

public class MyFooService : DataService<FooContext>
{
    public static void SetEntitySetAccessRules(IDataServiceConfiguration config)
    {
        config.SetEntitySetAccessRule("Foos", EntitySetRights.AllWrite);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我希望能够使用PUT修改实体.KendoUI提供了一个简单易用的配置界面,在生成PUT请求方面做得很好.

我们正在制作跨域请求并使用CORS.因此,Firefox会在发送PUT之前向OData服务发送预检OPTIONS请求.

不幸的是,服务端点似乎不支持OPTIONS开箱即用:对OPTIONS请求的响应是"501 Not Implemented",内容为空.至少我们管理过响应的CORS头如下:

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true" />
  <!-- Enable cross-origin resource sharing -->
  <!-- http://enable-cors.org/#how-asp.net -->
  <httpProtocol>
    <customHeaders>
      <add name="Access-Control-Allow-Origin" value="*" />
      <add name="Access-Control-Allow-Methods" value="POST, PUT, DELETE, GET, OPTIONS" />
      <add name="Access-Control-Allow-Headers" value="content-Type, accept, origin, X-Requested-With" />
      <add name="Access-Control-Allow-Credentials" value="true" />
    </customHeaders>
  </httpProtocol>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)

谷歌搜索已经变得有点挑战,因为"选项"是一个非常受欢迎的术语......

我发现这篇文章但看起来非常非常复杂.我的意思是,OData是关于REST的,我无法想象WCF数据服务不提供允许预检请求的简单方法,或者?

wcf-data-services odata cors preflight

6
推荐指数
1
解决办法
2651
查看次数

断言该值等于任何期望值集合

NUnit 是否提供了一个约束来确定实际值是否是给定的可枚举或数组的元素,换句话说,它等于多个预期值中的任何一个?就像是:

Assert.That(actual, Is.EqualToAnyOf(new[] { 1, 2, 3 }))
Run Code Online (Sandbox Code Playgroud)

也就是说,要指出的是,实际值是单个值。我希望值是1, 2, 或3。断言

Assert.That(actual, Contains.Element(expected))
Run Code Online (Sandbox Code Playgroud)

检查逻辑上相同,但意图相反:这里我们有一个实际值的集合,并期望其中有一个值。

此外,我发现了这些,但它们都不适合:

Assert.That(actual, Is.EqualTo(expected)) // only allows one value
Assert.That(actual, Is.InRange(start, end)) // only works for consecutive numbers
Assert.That(actual, Is.SubsetOf(expected)) // only works if actual is an enumerable
Assert.That(expected.Contains(actual)) // meaningless "expected: true but was: false" message
Run Code Online (Sandbox Code Playgroud)

.net c# nunit fluent-interface assertions

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

Excel自动化:缺少关闭事件

另外你好,

我正在通过C#中的Interop进行Excel自动化,我希望在工作簿关闭时得到通知.但是,工作簿上没有Close事件,也没有应用程序上的Quit事件.

以前有人这样做过吗?如何编写一段代码来响应正在关闭的工作簿(只有在工作簿真正关闭时才会执行)?理想情况下,这应该关闭工作簿发生,因此我可以依赖该文件来反映所有更改.

到目前为止我发现的细节:

有一个BeforeClose()事件,但是如果有未保存的更改,则在询问用户是否保存它们之前引发此事件,所以目前我可以处理该事件,我没有最终文件而且我无法发布COM对象,这两件事我都需要/做.我甚至不知道工作簿是否会实际关闭,因为用户可能会选择中止关闭.

然后有一个BeforeSave()事件.因此,如果用户选择"是"来保存未保存的更改,则 BeforeClose()之后执行BeforeSave().但是,如果用户选择"中止",然后点击"文件 - >保存",则执行完全相同的事件顺序.此外,如果用户选择"否",则根本不执行BeforeSave().只要用户没有单击任何这些选项,同样适用.

c# excel events interop

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

当程序集丢失时,.NET应用程序无法启动

我有一个.NET C#winforms应用程序,它在我的机器上运行良好,但如果我尝试在另一台机器上运行它,它就无法启动.没有错误消息,没有崩溃消息,没有窗口 - 没有.

我发现这总是在缺少引用的程序集时发生.我想这是.NET的一般行为而不是我的应用程序特有的,是吗?

有没有办法配置.NET或我的应用程序,以便它在这种情况下吐出"引用的程序集丢失",如错误消息?

.net c# reference winforms

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

VBA 中的 VSTO:AddIn.Object 有时不返回任何内容(空)

鉴于:

  • VSTO 插件
  • Anoverride object RequestComAddInAutomationService()返回Facade在我的场景中调用的类的实例。
  • Excel 2007 中的 VBA 宏,它访问AddIn.Object以获取 Facade 并使用它。
  • 很多时候这工作得很好。
  • 有几次出乎意料,这似乎不起作用。

更新:原来是特定用户有问题。她一直都有,别人从来没有(?永远不要说“从不”)

在这“几次”中,我得到

错误:对象变量或未设置块变量

在试图访问Facade. 简而言之,我可以告诉您,其中的代码RequestComAddInAutomationService()没有任何容易出错的魔法,而且用于访问加载项的 VBA 代码也取自网络,看起来也不错。更长的版本尚未推出,对于那些花时间阅读它的人:-)

问题:有没有人知道为什么会发生这种情况?是Excel问题吗?


承诺的细节:

我的插件.cs:

public partial class MyAddIn
{
    public Facade Facade { get; private set; }

    protected override object RequestComAddInAutomationService()
    {
        if (this.Facade == null)
            this.Facade = new Facade(Controller.Instance);

        return this.Facade;
    }
}
Run Code Online (Sandbox Code Playgroud)

Facade.cs:

[ComVisible(true)]
[Guid("1972781C-A71A-48cd-9675-AE47EACE95E8")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IFacade
{
    // some methods
}

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public …
Run Code Online (Sandbox Code Playgroud)

c# vba vsto excel-2007 .net-3.5

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

如何在网络驱动器上设置File.Create方法的超时?

我在我的应用程序中有一个要求,我需要在网络驱动器中创建文件,但是如果网络断开应用程序挂起一段时间并抛出异常,则在progess中创建文件.

我们有什么方法可以设置超时File.Create吗?

c# io file networkstream

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

使用SQL查询Web服务

最近我考虑将面向服务的架构与一个优秀的用户界面结合起来时感到有点震惊,该用户界面利用SQL来优化查询数据时的性能.

例如,ASP.NET的DevExpress网格视图非常酷,它将所有过滤,排序和分页逻辑委托给数据库服务器.但这假定数据从一个支持SQL的数据库服务器中检索的.

如果我想在数据库和UI层之间引入Web服务层,并让UI使用Web服务来查询数据,该怎么办?

  • 如何设计Web服务和UI,以便我可以通过Web服务将UI中的过滤请求传递到数据库?
  • 我是否需要提供List QueryData(string sqlQuery)样式Web服务并且必须自己解析SQL字符串以保证安全性/访问限制?
  • 或者是否有任何好的框架或设计指南可以减轻我的负担?

这一定是一个非常普遍的问题,我相信它已经相对充分地解决了,是吗?

我主要对基于.NET/C#或兼容的解决方案感兴趣.

编辑:我发现了OData和Microsoft WCF数据服务.如果我做对了,基于OData的应用程序可能如下所示:

  1. 用户 --- /给我第1页(记录1..10)/ ---> ASP.NET服务器控件(当然,通过HTTP)
  2. ASP.NET服务器控件 ---/LINQ查询/ ---> 数据服务客户端
  3. 数据服务客户端 ---/OData Query/---> WCF数据服务
  4. WCF数据服务 ---/LINQ查询/ ---> 实体框架
  5. 实体框架 ---/SQL查询/ ---> 数据库

如果我得到这个权利,我的DevExpress服务器控件应该可以委托一个过滤请求(例如给我的只有排名前10位)通过所有这些层向下,然后运用其索引等,以执行该查询数据库.

是对的吗?

编辑:很高兴看到这个帖子变得生动:-)很难确定接受什么答案,因为对我来说似乎一切都很好......

c# sql linq web-services

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