0

我是 WCF 世界的新手。我只是下载了一个代码并看到了 wcf 服务配置文件,但由于我缺乏知识,我对 WCF 服务的配置文件中的条目感到困惑。我浏览了一些在线文章,但我仍然感到困惑。

这是我的问题

1)<service name="WCFService.Service" 何时需要服务名称?我可以省略服务名称吗?如果可以,可能会出现什么样的问题?

2)我可以将任何名称设置为服务名称,如 abc.xyz 还是有一些分配服务名称的规则?

3)基地址有什么用?如果省略基地址,那么可能是什么问题。当需要基地址时。根据下面的配置条目,有两个基地址...为什么需要两个基地址。当人们给出更多的基地址时?只需查看下面的 2 个基地址,然后告诉我为什么人们给出两个基地址,为什么不给出一个……有什么具体原因吗?

4)有两个端点一个是tcp,另一个是mex。如果我省略 mex 基地址,那么服务将无法被发现?如果是,这意味着没有人可以从 VS IDE 或 svcutil 创建代理......我是对的。

5)如果mex端点将被删除,那么如何与服务交互......必须有其他出路。如果是这样,那么告诉我如何作为客户端与服务进行交互。

6)

只需查看上面的 mex 端点并告诉我我们可以写 mex 端点 url 之类的东西吗

**net.tcp://localhost:1645/MyServer/mex** instead of ChatServer ??

实际上 wcf 服务托管在名为 ChatServer 的 win 表单项目中。这是 url 变成net.tcp://localhost:1645/ChatServer/mex 的原因吗?

我见过很多人写 mex 端点,这里没有 url 分配给 mex 端点的地址标签....为什么?当我应该像上面那样编写 mex 端点时...请举例说明。

7) /mex....是什么意思net.tcp://localhost:1645/ChatServer/mex /mex 是强制的,mex 是固定词?

8) 现在看到 tcp 端点

tcp 端点地址没有 url 而 tcp 这个词已分配给地址属性...为什么?

我们不能将任何有效的 url 分配给 tcp 端点的地址字段吗?

9) tcp 端点的地址字段将始终具有称为“tcp”的固定词,无论是规则还是约定。

10) 如果我需要添加另一个名为 wsdualhttp 绑定的端点,那么我需要在配置文件中写入什么

11)假设某个开发服务将托管在 IIS 中,但客户端可以是另一个 asp.net Web 应用程序并赢得应用程序,那么他/她需要做什么?那么应该使用什么 url 客户端从 VS ide 创建代理?任何人都可以提供示例配置条目。

12) 如果我希望人们可以使用两个 url 来创建我的服务代理,如何编写配置文件......一个是示例net.tcp://localhost:1645/ChatServer/mex,另一个是http:/ /localhost:1645/ChatServer/message.svc

我知道我的问题非常基本,但我仍然无法对这些问题进行分类。还指导我如何拥有丰富的知识来大胆地创建配置文件条目。

是否有任何工具可以为我的服务创建正确的配置条目....我是否有任何自动化应用程序可以代表开发人员执行此操作。谢谢

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="WCFService.Service" behaviorConfiguration="behaviorConfig">

<host>
  <baseAddresses>
    <add baseAddress="net.tcp://localhost:1645/ChatServer/"/>
    <add baseAddress="http://localhost:1648/ChatServer/"/>
  </baseAddresses>
  </host>
  <endpoint address="tcp"
                  binding="netTcpBinding"
                  bindingConfiguration="tcpBinding"
                  contract="ChatService.IChat"/>

 <endpoint address="net.tcp://localhost:1645/ChatServer/mex"
                  binding="mexTcpBinding"
                  contract="IMetadataExchange"/>

 </service>
 </services>

 <behaviors>
 <serviceBehaviors>
 <behavior name="behaviorConfig">
  <serviceMetadata httpGetEnabled="true" httpGetUrl=""/>
  <serviceDebug includeExceptionDetailInFaults="true"/>
  <serviceThrottling maxConcurrentCalls="100" maxConcurrentSessions="100"/>
 </behavior>
 </serviceBehaviors>
 </behaviors>
 <bindings>
 <netTcpBinding>
 <binding name="tcpBinding"
                 maxBufferSize="67108864"
                 maxReceivedMessageSize="67108864"
                 maxBufferPoolSize="67108864"
                 transferMode="Buffered"
                 closeTimeout="00:00:10"
                 openTimeout="00:00:10"
                 receiveTimeout="00:20:00"
                 sendTimeout="00:01:00"
                 maxConnections="100">
  <security mode="None">
  </security>
  <readerQuotas maxArrayLength="67108864"
                          maxBytesPerRead="67108864"
                          maxStringContentLength="67108864"/>
  <reliableSession enabled="true" inactivityTimeout="00:20:00"/>
  </binding>
  </netTcpBinding>
  </bindings>
  </system.serviceModel>
  </configuration>

我的编辑部分从这里开始

3)你在说什么共同的部分。您在我的完整配置文件中看到了什么共同部分...请举例说明。

你说....如果省略基地址,则每次都需要多次指定公共部分。如果为多个传输协议指定端点,则需要多个基地址

你能用例子让我理解你所说的省略基地址吗,因为在阅读了你对第 3 点的回答后,我不清楚这些事情

4) 如果我禁用 mex 端点,那么如何使用 svcutil 创建 wsdl?如果我给我的服务 dll,那么客户端可以解码代码并获得我的完整源代码。你能更详细地告诉我你想对第 4 点说什么吗

12) 如果我公开两个 url 来使用我的服务,那么 asp.net 客户端可以使用 tcp url 创建服务代理,例如net.tcp://localhost:1645/ChatServer/mex ?? Web客户端使用tcp绑定会有什么问题吗?因为 tcp 状态已满,但 web 是无状态的……这就是为什么我要问 web 客户端使用 tcp 绑定 url net.tcp://localhost:1645/ChatServer/mex会有任何问题

13)在我的示例中,mex 端点看起来像

但是很多人创建了 mex 端点,例如

所以告诉我两个 mex 端点之间有什么区别......还告诉我什么时候应该去 1ts mex 端点,什么时候人们应该去第二个 mex 端点

14)在我的情况下,如果我会像这样写 mex end

和 tcp 端点之类的

那会是什么结果。我的服务是否会被发现。在这种情况下,我应该使用什么地址来创建服务代理。

如果可能的话,请用迷你样本回答我的问题以便于理解,因为我是 WCF 的新手......谢谢

4

1 回答 1

0

你的答案一一

  1. 始终需要服务名称。如果在配置文件中省略它,将出现与格式错误的配置文件相关的运行时错误(错误指示服务名称无效)。如果你在代码中省略它,它将形成编译时错误。

  2. 不可以。服务名称应该对应于实现服务的类型(连同命名空间)。检查答案以获取详细信息。

  3. 如果定义了多个端点(如服务端点和 mex 端点)与某个公共部分,则可以在基地址标签中指定公共部分。端点地址属性中只需要差分部分(通常为“”为服务端点,“mex”为mex端点)如果省略基地址,则每次都需要多次指定公共部分。如果为多个传输协议指定了端点(即 http 和 net.tcp 的基地址不同),则需要多个基地址。
    示例在这里有和没有基地址。
    共同部分是“net.tcp://localhost:1645/ChatServer”

  4. 如果省略 mex 端点,则需要离线向客户端提供合约信息。正如您所提到的,服务将无法被发现。因此,您需要以某种方式向客户端应用程序提供服务/数据合同信息(作为 WSDL/库/源文件)。要创建客户端,您需要的只是合约和配置。如果 mex 可用,则从 mex 端点收集此信息。如果 mex 不可用,则必须离线提供此信息。示例(通过电子邮件发送合同库和配置)。

  5. 出路是离线提供合约信息(如步骤4所述)

  6. 是的,但不建议避免歧义。

  7. 不,“mex”不是固定的。它可以是任何东西(只要 URL 有效)。“mex”只是未说明的协议/标准。

  8. 端点地址 = baseAddress + 地址属性。
    在这种情况下,地址(tcp 端点)=“net.tcp://localhost:1645/ChatServer/”+“tcp”

  9. 这不是惯例。它可以是任何东西(只要 URL 有效)。

  10. wsdualhttpbinding配置参考链接。然而并不是因为传输协议是http,你需要提供完整的地址。baseAddress 将不会被拾取。这是由于协议映射。

  11. 客户端应用程序(无论是 ASP.NET/console/win app/WPF/ 任何其他)都需要添加WCF 客户端配置和代理

  12. 如果由客户决定,他们想要使用哪个 URL(前提是他们有权访问并且他们知道)。如果您想在服务器端执行此操作,您可以使用路由服务功能(在 WCF 4.0 及更高版本中可用)。我不确定 Web 客户端如何使用 tcp 客户端(安全策略是否允许这样做?)。不管怎样,从服务器端暴露两个端点对于客户端如何访问端点没有问题。

由于格式问题,13/14 代码片段不可见。

于 2012-12-27T17:29:09.393 回答