【问题标题】:How to implement a self-hosted WCF Service with JSON and documentation?如何使用 JSON 和文档实现自托管 WCF 服务?
【发布时间】:2018-12-15 06:59:03
【问题描述】:

我有一个自托管 WCF 服务的 Windows 窗体项目。它已经工作了一段时间。通信是通过 XML 进行的。但是,现在我需要使用 JSON。到目前为止,我已经阅读和尝试了两天的东西,但没有运气。

所以,我是从这里开始的:

urlService = ("http://" & _ipAddress.ToString & "/mySvc") 
aManager = New mySvc 
host = New ServiceHost(aManager, New Uri(urlService))

Dim tBinding As BasicHttpBinding 
tBinding = New BasicHttpBinding() 
tBinding.Security.Mode = BasicHttpSecurityMode.None

host.AddServiceEndpoint(GetType(myInterface), tBinding, urlService)


Dim metadataBehavior As ServiceMetadataBehavior 
metadataBehavior = host.Description.Behaviors.Find(Of ServiceMetadataBehavior)()

If (metadataBehavior Is Nothing) Then   
    metadataBehavior = New ServiceMetadataBehavior  
    metadataBehavior.HttpGetUrl = New Uri(("http://" & _ipAddress.ToString & "/mySvcWSDL"))     
    metadataBehavior.HttpGetEnabled = True  
    metadataBehavior.ToString()     
    host.Description.Behaviors.Add(metadataBehavior) 
End If

host.Open()

所以,据我了解,我不能将 JSON 与 BasicHttpBinding 一起使用,因此我尝试将绑定切换为 wsHTTPBinding 和 webHTTPBinding,并更改端点或行为中的一些其他设置。有时项目运行,但它不起作用。有时项目无法启动(关于界面中的 uritemplate 装饰),有时项目启动但无法正常工作(我尝试使用该功能时出现 HTTP ERROR 405),有时出现有关 ContractFilter 和 EndpointDispatcher 的奇怪错误,等等。

另外,我改变了界面的装饰:

<ServiceContract()>
Public Interface myInterface
    <OperationContract()>
    <WebInvoke(Method:="GET", ResponseFormat:=WebMessageFormat.Json, RequestFormat:=WebMessageFormat.Json, UriTemplate:="/LeoTest1/{Param1}")>
    Function LeoTest1(Param1 As String) As String

End Interface

...以及,我的经理班:

<ServiceBehavior(InstanceContextMode:=InstanceContextMode.Single, IncludeExceptionDetailInFaults:=True, AddressFilterMode:=AddressFilterMode.Any)>
Public Class mySvc
...

另外,我不知道这是否与我的项目有问题或者只是它的方式有关,但我使用 XML 端点自动创建 XML 模板以用于与我的服务通信。我也想要(需要?)那些用于 JSON 协议的模板……有可能吗?我必须向主机添加其他内容吗?不能用 SOAPUI 做到这一点,我需要另一个工具吗?

非常感谢!

【问题讨论】:

    标签: .net json wcf


    【解决方案1】:

    您是否也尝试过以下步骤?

    1. 添加对 System.ServiceModel.Web 框架的引用
    2. 使用以下行更新 app.config 文件:

    <system.serviceModel>
      <services>
        <service name="YourServiceName">
          <endpoint address="http://localhost:YourPort/service1" binding="webHttpBinding" contract="YourServiceName.IService1" />
        </service>
      </services>
      <behaviors>
        <endpointBehaviors>
          <behavior>
            <webHttp />
          </behavior>
        </endpointBehaviors>
      </behaviors>
    </system.serviceModel>

    【讨论】:

    • 感谢您的回答。 ServiceModel.Web 已经添加到我的项目中。另外,我打算从代码中运行主机,而不需要静态 XML 配置。
    【解决方案2】:

    我不知道发生了什么,但我已经通过将 ServiceHost 对象替换为 WebServiceHost 对象来解决它。

    我仍然对某些方法有疑问(一种有效,另一种无效),但我认为这与此无关。

    问候,

    【讨论】:

      猜你喜欢
      • 2011-03-03
      • 2011-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多