WCF Restful API с несколькими параметрами

Я работаю над созданием релевантного API WCF в VB.Net и до сих пор работаю с получением данных из базы данных MSSQL с одним параметром и сохранением данных. В настоящее время я пытаюсь создать сервисный контракт с несколькими параметрами (адрес электронной почты и пароль) для проверки подлинности имени пользователя. Это продолжает выдавать следующую ошибку, и я просто не могу понять, как решить эту проблему:

Ошибка: невозможно получить метаданные с локального хоста:12345/SMPCService.svc Если это служба Windows (R) Communication Foundation, к которой у вас есть доступ, убедитесь, что вы включили публикацию метаданных по указанному адресу. Для получения справки о включении публикации метаданных обратитесь к документации MSDN по адресу go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata URI ошибки обмена: localhost:12345/SMPCService.svc Метаданные содержат ссылку, которая не может быть разрешена: localhost:12345/SMPCService.svc. Запрошенная служба 'localhost:12345/SMPCService.svc' не может быть активирована. Дополнительные сведения см. В журналах диагностической трассировки сервера.HETTP GET Ошибка URI: localhost:12345/SMPCService.svc Произошла ошибка при загрузке файла /localhost:12345/SMPCService.svc. Запрос не выполнен с сообщением об ошибке:-

Это мой сервисный контракт:

<OperationContract()>
<WebInvoke(Method:="GET", ResponseFormat:=WebMessageFormat.Json, BodyStyle:=WebMessageBodyStyle.Wrapped, UriTemplate:="ValidateLogin/{e}/{p}")>
Function ValidateLogin(ByVal sEmailAddress As String, ByVal sPassword As String) As List(Of CheckLogin)

И это функция ValidateLogin, которая вызывается:

Public Function ValidateLogin(ByVal sEmailAddress As String, ByVal sPassword As String) As List(Of CheckLogin) Implements ISMPCService.ValidateLogin
    Dim result As List(Of CheckLogin) = New List(Of CheckLogin)
    Dim uAction = New CheckLogin
    Dim pwd As String = ""
    Try
        ' Dimension Local Variables
        Dim uRecSnap As ADODB.Recordset

        ' Check For Open Connection
        If uDBase Is Nothing Then
            OpenConnection()
            bConnection = True
        End If

        ' Run Stored Procedure - Load Timesheet Record
        uCommand = New ADODB.Command
        With uCommand
            .ActiveConnection = uDBase
            .CommandType = ADODB.CommandTypeEnum.adCmdStoredProc
            .CommandTimeout = 0
            .Parameters.Append(.CreateParameter("@EmailAddress", ADODB.DataTypeEnum.adVarChar, ADODB.ParameterDirectionEnum.adParamInput, 30, sEmailAddress))
            .CommandText = "API_WebUser_ValidateLogin"
            uRecSnap = .Execute
        End With

        ' Populate List
        Do Until uRecSnap.EOF
            pwd = If(IsDBNull(uRecSnap("UserPassword").Value), "", uRecSnap("UserPassword").Value)
            uRecSnap.MoveNext()
        Loop
        uRecSnap = Nothing

        If pwd <> "" Then
            If pwd.Substring(0, 4) = "$2y$" Then
                Mid(pwd, 3, 1) = "a"
            End If

            If BCrypt.Net.BCrypt.Verify(SHA512Hash(sPassword), pwd) Then
                uAction.WasSuccessful = "OK"
                uAction.StatusDescription = "User credentials match"
            Else
                uAction.WasSuccessful = "FAIL"
                uAction.StatusDescription = "Failed to authorize user"
            End If

        Else
            uAction.WasSuccessful = "FAIL"
            uAction.StatusDescription = "Failed to authorize user"
        End If

        result.Add(uAction)
    Catch ex As Exception
        ' Catch Error
        If Err.Number <> 0 Then
            Console.WriteLine(ex.Message)
        End If

    Finally
        ' CleanUp

        ' Close Database Connection
        If bConnection Then CloseConnection()

    End Try

    Return result
End Function

Наконец, это мой Web.config:

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

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <!--Disabled custom errors to allow display of detailed errors.-->
    <customErrors mode="Off"/>
    <compilation debug="true" strict="false" explicit="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" relaxedUrlToFileSystemMapping="true"/>
  </system.web>
  <system.serviceModel>
    <services>
      <!--Specify services the application hosts. 
      Name specifies the type that provides an implementation of a service contract.
      Behavior Configuration specifies the name of one of the behaviours found in the behaviours element and governs actions such as whether the service allows impersonation.-->
      <service name="SMPCWebService.SMPCService" behaviorConfiguration="SMPCWebService.SMPCServiceBehaviour">
        <!--Define the service endpoints.-->  
        <endpoint address="../SMPCService.svc" behaviorConfiguration="webBehaviour" binding="webHttpBinding" contract="SMPCWebService.ISMPCService" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
          <behavior name="SMPCWebService.SMPCServiceBehaviour">
            <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
            <serviceMetadata httpGetEnabled="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>
      <!--Define the endpoint behaviour.-->
      <endpointBehaviors>
        <behavior name="webBehaviour">
          <webHttp />
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <protocolMapping>
        <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <!-- Allowing Cross-Origin Resource Sharing (CORS) - The httpProtocol settings allow web services to be called from external domains using JavaScript-->
    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Headers" value="Content-Type, Accept" />
      </customHeaders>
    </httpProtocol>
    <modules runAllManagedModulesForAllRequests="true"/>
    <httpErrors errorMode="Detailed" />
    <validation validateIntegratedModeConfiguration="false"/>
    <!--
        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>

</configuration>

Я просмотрел много сообщений, чтобы найти подсказки по этому вопросу, но я не получил нигде.

Сообщения, на которые я смотрел:

Почему я получаю эту ошибку WCF, когда получаю?

Не удалось добавить сервис. Метаданные службы могут быть недоступны. Убедитесь, что ваш сервис работает и предоставляет метаданные.

Как отправить адрес электронной почты как параметр в методе wcf

http://jeffbarnes.net/blog/post/2006/10/16/metadata-exchange-endpoint.aspx

1 ответ

Решение

Опробовав разные подходы, я наконец-то решил, где ошибся.

Имена параметров для функций должны называться так же, как параметры, указанные в UriTemplate.

Оригинал:

<OperationContract()>
<WebInvoke(Method:="GET", ResponseFormat:=WebMessageFormat.Json, BodyStyle:=WebMessageBodyStyle.Wrapped, UriTemplate:="ValidateLogin/{e}/{p}")>
Function ValidateLogin(ByVal sEmailAddress As String, ByVal sPassword As String) As List(Of CheckLogin)

Fix:

<OperationContract()>
<WebInvoke(Method:="GET", ResponseFormat:=WebMessageFormat.Json, BodyStyle:=WebMessageBodyStyle.Wrapped, UriTemplate:="ValidateLogin/{e}/{p}")>
Function ValidateLogin(ByVal e As String, ByVal p As String) As List(Of CheckLogin)
Другие вопросы по тегам