使用包含 Excel VBA 内的 DataContract 的 wcf 服务

2024-04-13

你读了标题并呻吟了。没关系。我也这么做了。但我们按照要求去做,对吧?我需要构建一个可以通过 Excel 中的名字进行访问的服务(2003 年,但我假设任何版本的 Excel 都应该支持此功能)。目前,我想做的就是将电子表格将数据发布到从远程计算机上的 Windows 服务运行的 WCF 服务。因为需要通过比 VBA 更复杂的东西来检索数据,所以我决定建立一个数据契约。这是我的代码(目前这只是一个概念验证,但它与完成后的外观密切相关)。

这是WCF相关的内容:

Imports System.ServiceModel
Imports System.Runtime.Serialization

<ServiceContract()>
Public Interface IWCF

    <OperationContract()>
    Sub PutData(ByVal what As String)

    <OperationContract()>
    Function GetWhats() As TheWhats()

End Interface

<DataContract()>
Public Class TheWhats
    <DataMember()> Public Property Timestamp As DateTime
    <DataMember()> Public Property TheWhat As String
End Class

Public Class WCF
    Implements IWCF

    Shared Whats As New List(Of TheWhats)

    Public Sub PutData(ByVal what As String) Implements IWCF.PutData
        Whats.Add(New TheWhats With {.Timestamp = Now, .TheWhat = what})
    End Sub

    Public Function GetWhats() As TheWhats() Implements IWCF.GetWhats
        Return Whats.ToArray
    End Function
End Class

我的应用程序配置:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.web>
    <compilation debug="true"></compilation>
  </system.web>
  <system.serviceModel>
    <services>
      <service name="DataCollectionService.WCF">
        <endpoint address=""
                  binding="netTcpBinding"
                  contract="DataCollectionService.IWCF" />
        <endpoint address="mex"
                  binding="mexTcpBinding"
                  contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost:9100/DataCollectionService/ "/>
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="false"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

我的 vba 类来处理发布内容:

Private Const pConxString As String = _
    "service:mexAddress=""net.tcp://localhost:7891/Test/WcfService1/Service1/mex"", " & _
    "address=""net.tcp://localhost:7891/Test/WcfService1/Service1/"", " & _
    "binding=""NetTcpBinding_IService1"", bindingNamespace = ""http://tempuri.org/"", " & _
    "contract=""IService1"", contractNamespace=""http://tempuri.org/"""

Public ServiceObject As Object

Private Sub Class_Initialize()
    Set ServiceObject = GetObject(pConxString)
End Sub

Public Sub PutData(ByVal what As String)
    ServiceObject.PutData what
End Sub

Private Sub Class_Terminate()
    Set ServiceObject = Nothing
End Sub

如果我包括DataContract属性和返回数据协定对象的函数,我的 vba 代码失败Public Sub PutData方法如下:

“MessagePartDescription Name='GetWhatsResult' Namespace='http://tempuri.org/' 的实例不能在此上下文中使用:未设置所需的 'Type' 属性。”

如果我取出 DataContract 并注释掉服务定义中的函数,就可以了。我不打算使用GetWhats()Excel 中的函数。但我猜它需要类型定义TheWhats.

根据我读到的内容,一种解决方案似乎是将其设为 COM 对象并引用 DLL。然而,这对于我的环境来说不是一个可行的解决方案。还有其他方法可以解决这个问题吗?


好吧,回答了我自己的问题。解决方案(至少在我的情况下)是拆分接口并让我的服务类实现这两个接口。这是我的新界面文件:

Imports System.ServiceModel
Imports System.Runtime.Serialization

<ServiceContract()>
Public Interface IWCF_WriteOnly

    <OperationContract()>
    Sub PutData(ByVal what As String)

End Interface

<ServiceContract()>
Public Interface IWCF_ReadOnly

    <OperationContract()>
    Function GetData() As TheWhats()

End Interface

<DataContract()>
Public Class TheWhats
    <DataMember()> Public Property Timestamp As DateTime
    <DataMember()> Public Property TheWhat As String
End Class

Public Class WCF
    Implements IWCF_WriteOnly
    Implements IWCF_ReadOnly

    Shared Whats As New List(Of TheWhats)

    Public Sub PutData(ByVal what As String) Implements IWCF_WriteOnly.PutData
        Whats.Add(New TheWhats With {.Timestamp = Now, .TheWhat = what})
    End Sub

    Public Function GetData() As TheWhats() Implements IWCF_ReadOnly.GetData
        Return Whats.ToArray
    End Function
End Class

这需要更改 app.config 以便两个单独的端点可以在同一地址上运行:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.web>
    <compilation debug="true"></compilation>
  </system.web>
  <system.serviceModel>
    <services>
      <service behaviorConfiguration="GenericBehavior" name="DataCollectionService.WCF">
        <endpoint address="wo" binding="netTcpBinding" contract="DataCollectionService.IWCF_WriteOnly" />
        <endpoint address="ro" binding="netTcpBinding" contract="DataCollectionService.IWCF_ReadOnly" />
        <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost:9100/DataCollectionService/" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="GenericBehavior">
          <serviceMetadata httpGetEnabled="false"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

由于只写端点与需要数据协定定义的端点隔离,因此 Excel 定义中的此更改是必要的:

Private Const pConxString As String = _
    "service:mexAddress=""net.tcp://localhost:9100/DataCollectionService/Mex"", " & _
    "address=""net.tcp://localhost:9100/DataCollectionService/wo"", " & _
    "binding=""NetTcpBinding_IWCF_WriteOnly"", bindingNamespace = ""http://tempuri.org/"", " & _
    "contract=""IWCF_WriteOnly"", contractNamespace=""http://tempuri.org/"""

我使用 WCF 测试客户端测试了此配置。我必须手动向它提供 mex 端点,但是当我这样做时,它会获取两个合同。我用的是PutData方法填充一点服务类,然后进入 Excel 并填充更多内容。我回到 WCF 测试客户端并运行GetData函数,它返回从测试客户端和 Excel 添加的所有项目。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用包含 Excel VBA 内的 DataContract 的 wcf 服务 的相关文章

  • Excel 工作表名称的有效字符

    在 Java 中 我们使用以下包以编程方式创建 Excel 文档 org apache poi hssf 如果您尝试设置工作表的名称 不是文件 而是内部 Excel 工作表 在以下情况下您将收到错误消息 名称超过 31 个字符 该名称包含以
  • 如何在 MessageContract 类型中使用 XML 属性?

    前面的注释 我无法更改传入的 SOAP 请求的格式 因为它们是由国际标准固定的 weeeeeeeee 我有一个 SOAP 请求进入我的 WCF 服务 如下所示
  • WPF DataGrid 验证/绑定模式错误

    我创建了一个非常简单的新项目 仅测试 Microsoft WPF DataGrid 行为 不涉及其他 我只使用标准的 DataGrid
  • 如何使用 Castle Windsor 将对象注入到 WCF IErrorHandler 实现中?

    我正在使用 WCF 开发一组服务 该应用程序正在使用 Castle Windsor 进行依赖注入 我添加了一个IErrorHandler通过属性添加到服务的实现 到目前为止一切正常 这IErrorHandler对象 一个名为FaultHan
  • Outlook 加载项,无法读取未定义的属性“BeginRequestEventArgs”

    我使用 Visual Studio 开发了 Outlook 插件 我的插件有一个按钮 用于填充会议邀请正文中的详细信息并添加所需的与会者 这在 99 的情况下都有效 但是 时不时地它会给我下面的 JavaScript 错误 Uncaught
  • 将签名位图转换为签名字符串(很奇怪的一个)

    基本上我需要将位图图像转换为字符串 但这不是常见的 困境在于该字符串由两部分组成 1 积分 2 线路 我需要将图像转换为由 分隔的两个部分 我得到的一个例子是 221A 221A270A270A25032503200720071716171
  • 使用宏打开受信任文档或启用宏时 Excel 崩溃

    正如标题所示 我无法使用宏打开受信任的文档 Excel 立即崩溃 制作文档的副本允许其打开 因为该副本不受信任 并且我可以检查 VB 编辑器中的宏 但启用宏会导致另一次崩溃 为什么会发生这种情况以及我可以采取什么措施来解决它 我今天遇到了类
  • Excel 2013 数据透视表不会更改当前页面,除非手动导航到

    我们有一小段 VBA 代码 多年来一直完美运行 本质上是 Me PivotTables APivot PivotFields AField CurrentPage Some text 这种方法一直有效 直到 Excel 2013 该行将失败
  • 有没有更简单的方法来处理复选框?

    在 vb net 中 我有一个包含一组四个复选框的表单 每个复选框都表示 选中时 用户想要向其订单添加特殊指令 代码如下所示 If SpecialInstruction1CheckBox Checked Then AddSpecialIns
  • 选项卡索引不适用于面板中的控件?

    我有一个 vb net Windows 窗体 其中包含大约 15 个组合框和 15 个文本框 以及其他几个控件 所有这些TextBoxes and ComboBoxes位于面板中 原因是我需要根据用户选择 输入的内容来调整控件的可见属性 因
  • 如何保证单向方法的可靠性?

    The 关于单向调用 回调和事件您需要了解的信息 http msdn microsoft com en us magazine cc163537 aspx文章讲述 客户端不关心调用结果的事实并不意味着客户端根本不关心调用是否发生 一般来说
  • 如果 Excel 中的表格包含单元格引用,如何对其进行排序?

    我在工作表 1 中有一个 Excel 数据表 它引用了许多其他工作表中的各种不同单元格 当我尝试对工作表进行排序或过滤时 引用会随着单元格的移动而发生变化 但是 我不想手动进入每个单元格并在各处插入 符号 因为有些引用是连续的 我可能想稍后
  • SQL存储过程执行时间差异

    我在 win form 应用程序中遇到奇怪的问题 我正在调用一个存储过程 并且执行大约需要 6 秒 此存储过程接受多个参数 包括一个输出参数 从应用程序级别我使用 Dim dt1 DateTime Now cmd ExecuteNonQue
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • VBA Excel:将范围值分配给新范围

    我在将一个工作簿范围中的值分配给当前工作簿中的某个范围时遇到问题 当我使用 Range A1 C1 分配我的范围时 此代码工作正常 但是当我使用 Range Cells 1 1 Cells 1 3 定义我的范围时 该函数会失败 Sub Co
  • 如何隐藏组合框下拉列表中的列?

    我正在 Excel 用户窗体中构建一个 ComboBox 该用户窗体从 Access 表中获取其行 我想在下拉列表中向用户显示多个文本字段 但从 ComboBox 返回的值应该是与用户选择的行关联的 ID 号 即 ID 列是绑定列 但我不想
  • 将用户定义的表类型从 VBA 传递到 SQL

    我的任务是创建一个 Excel 电子表格作为 SQL 数据库的前端 以及一些对数据执行复杂计算的 C 我的老板想要前端作为电子表格 而计算对于 VBA 来说似乎太复杂了 目前 检索数据集的存储过程运行良好 然后 用户将在 Excel 中编辑
  • 如何将对象列表发送到 WCF 服务?

    我正在构建 WCF 服务 我想接受 List 作为我的方法之一的参数 这是我的代码 ServiceContract public interface IProductService OperationContract int InsertP
  • 在 WCF 服务上启用 CORS。获取 HTTP 405:不允许的方法

    我正在尝试在 WCF 服务上启用 CORS 当我尝试从客户端发送请求时 该请求是使用OPTIONS动词 我总是得到一个HTTP 405 Method not allowed error 如果我尝试使用 Fiddler 并使用以下命令创建相同
  • 如何检查python xlrd库中的excel文件是否有效

    有什么办法与xlrd库来检查您使用的文件是否是有效的 Excel 文件 我知道还有其他库可以检查文件头 我可以使用文件扩展名检查 但为了多平台性我想知道是否有任何我可以使用的功能xlrd库本身在尝试打开文件时可能会返回类似 false 的内

随机推荐

  • 使用带有 unicode 的 xhtml2pdf 时遇到问题

    我一直在尝试转换希伯来语 html 文件但没有成功 无论我尝试何种编码 希伯来语字符在输出 PDF 中都会显示为黑色矩形 我尝试了 pisa 发行版中包含的一些 unicode 测试文件 pisa 3 0 33 test test unic
  • ASP.Net Identity 2 通过短信重置密码

    我希望在重置密码时向用户发送短信 我已经具备发送短信的功能 我只需要有关如何使用 Identity 2 0 进行设置的指南 我似乎无法在网上找到任何有用的信息 参考代码本身也没有正确注释 我想生成一个安全代码 将其发送给用户 然后他必须将其
  • sp改变时函数导入

    我正在使用实体框架的函数导入功能从 net 4 0 代码调用存储过程 但是 每次更改存储过程结果集时 我都必须删除函数导入并再次添加 有什么方法可以通过更改实体模型中的代码来合并更改 而不必再次删除并添加函数导入 谢谢 使用函数导入时 一些
  • Oracle 主键:NUMBER 与 NUMBER(7,0)

    指定 PK 的精度有什么好处吗 鉴于记录可能永远不会超过几千条 7 0 是否足够 不指定精度有什么危险吗 NUMBER 7 0 只是限制了值域 它们的内部表示没有不同 CREATE TABLE t pk col1 NUMBER 7 0 NO
  • 访问数据库表单 ActiveX 控件错误

    我正在使用一个带有日期选择器控件的表单 当打开表单并单击日期选择器控件 MSCOMCT2 OCX 时 我收到以下无用的错误 您输入的表达式 Change 作为偶数属性设置 产生以下错误 加载 ActiveX 时出错 控制您的一份表格或报告
  • save_and_open_page 不适用于水豚 2.0?

    我刚刚将水豚更新到 2 0 并且所有 save and open page 调用都返回一个没有样式的 html 页面 它在页面顶部正确地提供了样式表链接 当我恢复到水豚 1 3 时 样式再次起作用 有人知道如何解决这个问题 和 或问题是什么
  • Android底层读取大于2GB的SD卡

    我的 Android 应用程序尝试通过访问实际设备 在我的例子中为 dev block vold 179 1 来读取 SD 卡的物理扇区 当然这是在有root权限的手机上 我可以将设备打开为FileInputStream 并从中读取数据 但
  • 获取我的 Facebook 页面上粉丝的用户列表 GRAPH API

    如何获取我的 Facebook 页面上粉丝的用户列表 遗憾的是 目前无法获取您的 Facebook 页面的粉丝列表 目前尚不清楚这是设计使然还是错误 This 脸书错误报告 http bugs developers facebook net
  • 流畅的 NHibernate 将 IList 作为值映射到单列

    我有这门课 public class MyEntity public virtual int Id get set public virtual IList
  • 在nodejs服务器的内存中存储

    似乎有很多有前途的软件包 但没有明确建议哪个是最快的 可扩展的 哪个是内存效率更高的 npm 安装memoizee https www npmjs com package memoizee npm 安装内存缓存 https www npmj
  • 在 iPhone/Android 中始终显示滚动条 [重复]

    这个问题在这里已经有答案了 有没有办法让滚动条在移动浏览器中始终可见 默认情况下 仅当发生触摸 滑动时 可滚动页面的滚动才可见 如何使滚动条始终可见 在你的 css 样式上尝试一下这个 webkit scrollbar webkit app
  • 在php中获取XML文件内容作为字符串

    我想将 xml 文件的内容显示为本身 我不想解析它 而是只是读取它的内容并显示它 I tried content file get contents test xml But the content其中有 xml 当我var dump co
  • 如果mysql数据类型是默认值为“0000-00-00 00:00”的时间戳,如何检查是否为空?

    我想找出最好的返回方式true or false如果 mysql 数据类型是TIMESTAMP为 null 返回日期0000 00 00 00 00 我尝试过这样的事情 if mycolumn 0000 00 00 00 00 echo n
  • ArrayList 是如何工作的?

    ArrayList内部使用什么数据结构 内部有一个ArrayList使用一个Object 当您将项目添加到ArrayList 列表检查后备阵列是否还有剩余空间 如果有空间 新项目将添加到下一个空白处 如果没有空间 则会创建一个更大的新数组
  • Kubectl 与 minikube - 重新启动集群时出错:kubeadm.yaml

    我安装了 kubernetes minikube install MacOs 10 12 6 但在尝试启动 minikube 时 我不断收到错误 minikube start Starting local Kubernetes v1 10
  • Django Rest 框架:如何在 ModelViewSet 中关闭/打开分页

    我在用着Django REST 框架 https github com encode django rest framework tree master with djangorestframework csv https github c
  • 非分组表的 UITableView 节标题高度

    问候 我知道UI表格视图 节标题高度仅用于分组表 但无论如何我都会问 如果有某种方法可以做到这一点并不明显 有没有办法更改节标题高度 以及字体 大小 NON 分组表 希望 是 或至少是 也许 但担心这可能是 否 伙计们 努力吧 Yes 使用
  • 如何将材质的 TreeView 的折叠/展开图标更改为右侧?

    我正在尝试使用 Reactjs 中的材料来实现一棵树 但是 根据我的设计 折叠和展开的按钮应该位于右侧 另外 在添加图标时出现错误TreeItem像这样
  • CursorAdapter 中光标的更改

    我正在努力改变Cursor in CursorAdapter这边走 Cursor newCursor compiledStatement getCursor startManagingCursor newCursor adapter cha
  • 使用包含 Excel VBA 内的 DataContract 的 wcf 服务

    你读了标题并呻吟了 没关系 我也这么做了 但我们按照要求去做 对吧 我需要构建一个可以通过 Excel 中的名字进行访问的服务 2003 年 但我假设任何版本的 Excel 都应该支持此功能 目前 我想做的就是将电子表格将数据发布到从远程计