2016-11-15 1 views
0

Я создал службу WCF Rest, которые берут ввод/вывод от клиента и сохраняют его в базе данных и знаниях с идентификацией таблицы, в которой добавлены данные. Когда я потребляю клиентский сервис, который ничего но веб-приложение, создающее URL-адрес в качестве веб-запроса и получающего надлежащую выходную информацию. Но когда я потребляю через браузер ошибку. Сначала я попытался, как это: -'Конечная точка не найдена.' в то время как потребление службы отдыха WCF через браузер

http://localhost:Portnumber/Test.svc/ADD/Bodywash/Orange/50 

после того, как этот ХТ

tp://localhost:Portnumber/Test.svc/ADD?Name=Bodywash&CategoryName=Orange&Price=50 

я получаю error'Entpoint не found'.How потреблять услуги остальное через браузер я способен? сделать

// Code of service 

-- Table 
CREATE TABLE [dbo].[Product](
    [ProductId] [int] IDENTITY(1,1) NOT NULL, 
    [Name] [varchar](50) NULL, 
    [CategoryName] [varchar](50) NULL, 
    [Price] [int] NULL 
) 

-- Sp 
ALTER procedure [dbo].[proc_InsertProduct] 
(
@id int out, 
@Name nvarchar(50), 
@CategoryName nvarchar(50), 
@Price int 
) 
as insert into Product 
(
Name, 
CategoryName, 
Price 
) 
values 
(
@Name, 
@CategoryName, 
@Price 
) 

set @id = @@identity 
return @id 


-- Interface 

public interface ITest 
    { 
     [WebInvoke(UriTemplate = "ADD/{Name}/{CategoryName}/{Price}", Method = "POST", ResponseFormat = WebMessageFormat.Json)] 
     int InsertProduct(string Name, string CategoryName, string Price); 
    } 


-- class 

public class Test : ITest 
{ 
    public int InsertProduct(string Name, string CategoryName, string Price) 
     { 
      string constr = ConfigurationManager.ConnectionStrings["SampleConnectionString"].ConnectionString; 
      SqlConnection con = new SqlConnection(constr); 
      SqlCommand cmd = new SqlCommand("proc_InsertProduct", con); 
      cmd.CommandType = CommandType.StoredProcedure; 
      con.Open(); 
      cmd.Parameters.AddWithValue("@Name", Name); 
      cmd.Parameters.AddWithValue("@CategoryName", CategoryName); 
      cmd.Parameters.AddWithValue("@Price", Price); 
      cmd.Parameters.Add("@id", SqlDbType.Int); 
      cmd.Parameters["@id"].Direction = ParameterDirection.Output;//Output parameter 
      cmd.ExecuteNonQuery(); 
      con.Close(); 
      int result = (int)(cmd.Parameters["@id"].Value); 
      return result;//returning id 
     } 
    } 



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

    <appSettings> 
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" /> 
    </appSettings> 

    <connectionStrings> 
    <add name="SampleConnectionString" connectionString="Data Source=xxx.xxx.x.x;Initial Catalog=sample;Persist Security Info=True;User ID=sa;Password=xxxx" providerName="System.Data.SqlClient"/> 
    </connectionStrings> 

    <system.web> 
    <compilation debug="true" targetFramework="4.5" /> 
    <httpRuntime targetFramework="4.5"/> 
    </system.web> 


    <system.serviceModel> 

    <services> 
     <service name="RestApiTest.Test" behaviorConfiguration="serviceBehavior"> 
     <endpoint address="" binding="webHttpBinding" contract="RestApiTest.ITest" behaviorConfiguration="web"> 
     </endpoint> 
     </service> 
    </services> 

    <behaviors> 
     <serviceBehaviors> 
      <behavior name="serviceBehavior"> 
      <serviceMetadata httpGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
      </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 
     <behavior name="web"> 
      <webHttp/> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 


    <protocolMapping> 
     <add binding="basicHttpsBinding" scheme="https" /> 
    </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> 

</configuration> 
+0

_Вы смогу это сделать - Да, вы можете получить доступ к конечным точкам GET RESTful WCF через браузер. Но чтобы определить вашу проблему, вам может понадобиться также предоставить код WCF. Метод, который вы пытаетесь ударить, кажется, является методом POST - если этот метод (ADD) является методом POST, вы не можете его ударить через браузер. Пользователь Fiddler/Postman вместо – Developer

+0

Да, мой запрос отправлен. Я вставляю запись в таблицу. Я буду изменять свой вопрос. –

+1

Как я сказал ранее, если метод POST, используйте Fiddler/Postman вместо того, чтобы ударить его из браузера – Developer

ответ

0

Продолжение от комментариев - обновление в ответ из-за ограничений на размер комментариев

Это будет работать, хотя я не рекомендую это делать - уважая HTTP-глаголы, все запросы на получение должны быть GET, добавление должно быть POST, обновление должно быть PUT (PATCH в случае исправлений) и delete должны быть методами DELETE. Я предлагаю вам вернуть этот метод обратно к POST.

Поскольку клиент может получить доступ к нему через браузер - Таким образом, я предполагаю, что вы хотите сказать, что эта услуга будет использоваться с клиентской стороны с использованием кода JavaScript. Если это правда, тогда вам не нужно беспокоиться об этом. если у кого-то POST-данные (например, с использованием $.ajax или $.post в случае jQuery) в службу REST, вы получите данные правильно.

Чтобы сделать этот метод стандартным методом POST, пожалуйста, измените подпись метода, чтобы принять объект comples вместо получения Name, CategoryName & Цена от маршрута. Измените это int InsertProduct(string Name, string CategoryName, string Price); на что-то вроде int InsertProduct(Product product);, где 'Product' class has required properties. Здесь вы можете найти пример реализации - POST complex object to WCF REST.

Смежные вопросы