使简单的WCF服务工作的问题

时间:2012-07-03 17:33:00

标签: c# wcf

我在让我的网络服务上运行POST和GET时感到非常沮丧。我需要停下来,放松一下,弄清楚出了什么问题。

我把它分解成一个非常简单的方法,只需要一个字符串并回显它。这适用于我在我的localhost上设置的IIS,它适用于生产盒,但同样的配置在我的测试系统上破坏。请让我知道我做错了什么。访问时:

http://test.softwaredesignexcellence.com/WebPostService/WebPostSvc.svc/json/Test?testtext=test%20me

我正在获取一个带有粗体标题的页面,其中包含文本“Service”和较小文本中的子标题,表示“未找到端点”。 为什么我收到此消息?使用查询字符串“http://localhost/Services/WebPostSvc.svc/json/Test?testtext = test%20me”在我的本地主机上运行相同的服务。我收到了回复:

<string>Echoing test me</string>

生产服务器,我无法链接到它,因为它是内部的,它的响应略有不同,但它仍然正常工作:

 <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Echoing test me</string>

当我在本地发布,点击本地Web服务器,一切正常时,这是令人沮丧的。我将已发布的文件夹复制到生产服务器,在该服务器上键入类似的URL,一切正常,然后我将相同的代码和相同的设置ftp到我的测试服务器,它正在打破上面列出的错误(端点)未找到。)。 我不明白是什么让我无法在测试服务器上运行简单的服务?

Web服务的接口:

    [ServiceContract( Namespace="http://services.alorica.com/WebPostSvc/1.0" )]
    public interface IWebPostSvc
    {
        [OperationContract]
        [WebGet]
        string Test(string testtext);
    }

这是我尝试使用的简单方法:

    [WebService(Namespace = "http://services.alorica.com/WebPostSvc/1.0")]
    [ServiceBehavior(Namespace = "http://services.alorica.com/WebPostSvc/1.0")]
    public class WebPostSvc : IWebPostSvc
    {
        public string Test(string testtext)
        {
             return String.Format("Echoing {0}", testtext);
        }
    }

我的设置变得不合适,因为我一直在试图让一切正常。  更新 - 我刚刚删除了serviceHostingEnvironment部分,它似乎没有必要,Web服务仍在使用SOAP,但json仍然给我“端点未找到”。

 <system.serviceModel>

    <!-- Set up Custom Behaviors -->
    <behaviors>

      <endpointBehaviors>
        <behavior name="jsonBehavior">
          <webHttp/>

        </behavior>
      </endpointBehaviors>


      <serviceBehaviors>
        <behavior name="SvcMetaBehavior" >
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>

    </behaviors>


    <!-- Set up the binding configuration  -->
    <bindings>

      <basicHttpBinding>
        <binding name="SOAPBinding">
          <security mode="None">

          </security>
        </binding>
      </basicHttpBinding>

      <webHttpBinding>
        <binding name="JSONBinding"
                 hostNameComparisonMode="StrongWildcard"
                 receiveTimeout="00:10:00"
                 sendTimeout="00:10:00"
                 openTimeout="00:10:00"
                 closeTimeout="00:10:00"
                 maxReceivedMessageSize="1000000"
                 maxBufferPoolSize="2000000"
                 bypassProxyOnLocal="false"
                 useDefaultWebProxy="true" >
          <security mode="None">

          </security>
        </binding>
      </webHttpBinding>


    </bindings>

    <services>

      <!-- -->
      <service  behaviorConfiguration="SvcMetaBehavior"
               name="WebPostService.WebPostSvc"
      >

        <endpoint address="soap"
                  binding="basicHttpBinding"
                  bindingConfiguration="SOAPBinding"
                  contract="WebPostService.IWebPostSvc"
        />

        <endpoint address="json"
                  binding="webHttpBinding"
                  bindingConfiguration="JSONBinding"
                  behaviorConfiguration="jsonBehavior"
                  contract="WebPostService.IWebPostSvc"

        />

        <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />

      </service>

    </services>

  </system.serviceModel>

3 个答案:

答案 0 :(得分:1)

您的服务没有在端点中定义任何主机。

 <services>
  <service name="WebPostService.WebPostSvc">
    <endpoint address="" binding="basicHttpBinding" bindingConfiguration="SOAPBinding" name="serviceBasicHttpBinding" contract="WebPostService.IWebPostSvc">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <host>
      <baseAddresses>
        <add baseAddress="http://test.softwaredesignexcellence.com" />
      </baseAddresses>
    </host>
  </service>
     </services>

答案 1 :(得分:0)

尝试将UriTemplate添加到WebGet。实际上你应该使用WebInvoke进行POST。

答案 2 :(得分:0)

谢谢你们,答复得那么快。我发现了我的特殊问题,它不像我想象的那样在配置中。

我发布的服务器没有安装.NET 3.5,这很好,因为.NET 2.0就足够了,但它缺少程序集。我不知道为什么我没有得到更好的错误消息,但解决方案是查看我的引用,并将它们切换到“复制本地”并进行重新发布,之后一切都在该服务器上工作。我沮丧地对所有引用做了“复制本地”,但我确信我只需要对那些未包含在.NET 2.0框架中的内容执行此操作。