0

我是 WCF Web 服务的新手。我正在尝试测试我的简单 hello world web 服务。现在,我正在做自我托管。我正在启动主机应用程序,打开浏览器并输入资源的地址。我还运行 Fiddler 并使用 Composer 创建了一个请求。在这两种情况下,我都会收到“您已创建服务”。链接到我的 .wsdl 的页面。

我期待在我的响应中看到“Hello World”文本或具有“...Hello world”的网页。

我错过了什么?还是我只是误解了这个过程?

应用程序配置

<?xml version="1.0"?>
<configuration>

    <system.serviceModel>
      <services>
         <service name="My.Core.Services.GreetingService" behaviorConfiguration="MyServiceTypeBehaviors">
            <host>
               <baseAddresses>
                 <add baseAddress="http://localhost:8080/greeting"/>
               </baseAddresses>
            </host>
            <endpoint name="GreetingService" binding="webHttpBinding" contract="My.Core.Services.IGreetingService"/>
            <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
       </service>
    </services>

    <behaviors>
       <serviceBehaviors>
            <behavior name="MyServiceTypeBehaviors" >
                <serviceMetadata httpGetEnabled="true" />
            </behavior>
       </serviceBehaviors>
    </behaviors>
   </system.serviceModel>

<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>

主机代码

using System;
using System.ServiceModel;
using My.Core.Services;    

namespace My.Service.Host
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var host = new ServiceHost(typeof(GreetingService)))
            {
                host.Open();
                Console.WriteLine("The service is ready.");
                Console.WriteLine("Press <ENTER> to terminate service.");
                Console.WriteLine();
                Console.ReadLine();
                host.Close();
            }
        }
}

}

Hello World 合同和服务

using System.ServiceModel;
using System.ServiceModel.Web;

namespace My.Core.Services
{
   [ServiceContract]
   public interface IGreetingService
   {
      [OperationContract]
      [WebGet(UriTemplate = "/")]
      string GetGreeting();
   }
}

using System.Collections.Generic;

namespace My.Core.Services
{
    public class GreetingService : IGreetingService
    {
        public string GetGreeting()
        {
             return "Greeting...Hello World";
        }
    }
}
4

2 回答 2

1

如果我理解正确,您可以在以下网址看到您的 wsdl 链接

http://localhost:8080/greeting

为了现在调用您的端点,您需要像这样将其添加到 url

http://localhost:8080/greeting/GetGreeting/

我不完全确定为什么你有 UriTemplate 东西,但我猜测你可能只是从一个例子中复制粘贴它。除非您有要定义的特定查询字符串参数,否则您并不真正需要它,而且它往往会使事情复杂化,所以我建议您将其取出。这意味着您的界面看起来像这样......

[ServiceContract]
public interface IGreetingService
{
   [OperationContract]
   [WebGet]
   string GetGreeting();
}

...然后您可能会丢失网址上的最后一个“/”。

于 2012-08-14T23:50:39.100 回答
0

I figure out the problem. When I use the url: "http://localhost:8080/greeting" the server sends the temp page. When I add the backslash "/" on the end of the url it execute my service. so, "http://localhost:8080/greeting/" works and sends me the "...Hello World" back.

于 2012-08-15T15:12:40.977 回答