通过url调用Web服务

时间:2018-06-05 07:14:37

标签: c# web-services wcf

所以,我已经制作了这个Web服务(我猜的是WCF服务),它输入一些参数并返回一个json对象。这非常有效。

但现在我想对客户进行一些更改。

目前我只有一个按钮,一些用于输入的文本框和一个textarea。

按钮如下所示:

ServiceReference1.Service1Client sc = new ServiceReference1.Service1Client();
protected void Button11_Click(object sender, EventArgs e)
{
    int? i;
    if (tbSagsNr.Text != "")
    {
        i = Convert.ToInt32(tbPOSTUdlSag.Text);
    }
    else
    {
        i = null;
    }
    string s = tbFacilitet.Text;
    string a1 = tbAdresse1.Text;
    string a2 = tbAdresse2.Text;
    string p = tbPostNr.Text;

    string json = sc.HouseSearch(i, s, a1, a2, p);

    TextArea1.InnerText = json;
}

如果我想通过网址调用网络服务,该怎么办?我认为它应该看起来像这样,取决于我使用的参数:

http://localhost:58637/Default.aspx/Service1.svc/HouseSearch?vSagsNr=5

而不是文本框以及它应该直接在屏幕上打印json字符串。

我在制作网络服务时非常陌生,而且我觉得到目前为止,我有点笨手笨脚。

IService1:

    [OperationContract()]
    [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "HouseSearch")]
    string HouseSearch(int? vSagsNr, string vFacilitet, string vAdresse1, string vAdresse2, string vPostNr);

编辑:实际上看起来应该更像这样:

http://localhost:58637/WCFTest3/Service1.svc/HouseSearch?vSagsnr=5

编辑:我的webconfig现在看起来像这样:

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

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.6.1" />
    <httpRuntime requestPathInvalidCharacters="" requestValidationMode="2.0" targetFramework="4.6.1"/>
    <pages validateRequest="false" />
  </system.web>
  <system.serviceModel>
    <services>
      <service behaviorConfiguration="WCFTest3_Behavior" name="WCFTest3.Service1">
        <endpoint
            address =""
            binding="webHttpBinding"
            bindingConfiguration="webHttpEndpointBinding"
            name="WCFTest3.Service1"
            contract="WCFTest3.IService1"
            behaviorConfiguration="web"/>
        <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="" name="mexEndPoint" contract="IMetadataExchange"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="WCFTest3_Behavior">
          <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
          <serviceMetadata httpGetEnabled="false" />
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="web">
          <webHttp />
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <bindings>
      <webHttpBinding>
        <binding name="webHttpEndpointBinding">
          <security mode="Transport">
            <transport clientCredentialType="Windows" />
          </security>
        </binding>
      </webHttpBinding>
    </bindings>
    <protocolMapping>
      <add binding="webHttpBinding" scheme="http" />
    </protocolMapping>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <!--
        To browse web app root directory during debugging, set the value below to true.
        Set to false before deployment to avoid disclosing web app folder information.
      -->
    <directoryBrowse enabled="true"/>
  </system.webServer>
  <connectionStrings>
    <add
      name="UnikBoligCon"
      connectionString="server=??;database=??;user=??;password=??"
      providerName="System.Data.SqlClient"
  />
  </connectionStrings>
</configuration>

但是我收到了这个错误:

No base address found that matches the https form for the endpoint with the WebHttpBinding link. Registered base address schemas are [http].

编辑:哦等等我想我需要填写地址,webconfig中的服务现在看起来像这样

<services>
      <service behaviorConfiguration="WCFTest3_Behavior" name="WCFTest3.Service1">
        <endpoint
            address ="http://localhost:58532/Service1.svc"
            binding="webHttpBinding"
            bindingConfiguration="webHttpEndpointBinding"
            name="WCFTest3.Service1"
            contract="WCFTest3.IService1"
            behaviorConfiguration="web"/>
        <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="" name="mexEndPoint" contract="IMetadataExchange"/>
      </service>
    </services>

我已经摆脱了&#34; multipleSiteBindingsEnabled =&#34; true&#34;&#34;因为它犯了一个错误,我认为我不需要它。

现在收到此错误:

The authentication schemes configured on the host (Anonymous) do not allow those configured on the binding WebHttpBinding (“Anonymous”). Please ensure that the SecurityMode is set to Transport or TransportCredentialOnly. Additionally, this may be resolved by changing the authentication schemes for this application through the IIS management tool, through the ServiceHost.Authentication.AuthenticationSchemes property, in the application configuration file at the element, by updating the ClientCredentialType property on the binding, or by adjusting the AuthenticationScheme property on the HttpTransportBindingElement.

1 个答案:

答案 0 :(得分:1)

我做了与你描述的大致相同的事情。可以切换(通过更改web.config)以提供Http,NetTCP或REST的WCF服务。让Http和NetTCP配置并排放置很容易,但我无法弄清楚如何将REST配置与其他两个配置相结合,所以我将它们分开(我的要求没有要求REST api,我只是想这样做。)

我的运营合同是:

[OperationContract]
[
 WebInvoke(Method = "GET",
           BodyStyle = WebMessageBodyStyle.Wrapped,
           RequestFormat = WebMessageFormat.Json,
           ResponseFormat = WebMessageFormat.Json,
           UriTemplate = "TestMethod/{applicationCode}/?ignoreStatus={ignoreStatus}&logonName={logonName}&userProfileId={userProfileId}")
]
String TestMethod(String applicationCode, Boolean ignoreStatus = false, String logonName = "", String userProfileId = "");

可以通过Url调用(使用Internet浏览器测试)。

http://localhost/JayVServerV2/DataAccess/DataAccess.svc/TestMethod/Tom?ignoreStatus=true&logonName=JayV&userProfileId

解决方案最重要的部分是正确设置Web.Config。所以,我已经把我的整个Web.Config包含在内,看看我是怎么做到的。

<?xml version="1.0"?>
<configuration>
<system.web>
    <compilation debug="true" targetFramework="4.5.2"/>
    <httpRuntime targetFramework="4.5"/>
    <authentication mode="Windows"/>
    <authorization>
        <allow users="*"/>
    </authorization>
    <identity impersonate="false"/>
</system.web>
<system.serviceModel>
    <services>
        <service behaviorConfiguration="JayVServer_Behavior" name="JayVServerV2.DataAccess.DataAccess">
            <endpoint
                address =""
                binding="webHttpBinding"
                bindingConfiguration="webHttpEndpointBinding"
                name="RestJayVServerV2.DataAccess.DataAccess"
                contract="DataServerV2.DAtaAccess.IDataAccess"
                behaviorConfiguration="web"/>
            <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="" name="mexEndPoint" contract="IMetadataExchange"/>
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="JayVServer_Behavior">
                <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
                <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
                <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
                <serviceDebug includeExceptionDetailInFaults="true"/>
            </behavior>
        </serviceBehaviors>
        <endpointBehaviors>
            <behavior name="web">
                <webHttp />
            </behavior>
        </endpointBehaviors>
    </behaviors>
    <bindings>
        <webHttpBinding>
            <binding name="webHttpEndpointBinding">
                <security mode="TransportCredentialOnly">
                    <transport clientCredentialType="Windows" />
                </security>
            </binding>
        </webHttpBinding>
    </bindings>
    <protocolMapping>
        <add binding="webHttpBinding" scheme="http" />
    </protocolMapping>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
</system.serviceModel>
<system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <directoryBrowse enabled="true"/>
</system.webServer>
</configuration>
相关问题