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)