Вопрос по c#, .net, wcf, rest – Удаленный сервер возвратил ошибку: (405) Метод не разрешен. WCF REST Service

7

Этот вопрос уже задавался в другом месте, но эти вещи не являются решением моей проблемы.

Это мой сервис

[WebInvoke(UriTemplate = "", Method = "POST")]
public SampleItem Create(SampleItem instance)
{
    // TODO: Add the new instance of SampleItem to the collection
    // throw new NotImplementedException();
    return new SampleItem();
}

У меня есть этот код для вызова вышеуказанной службы

XElement data = new XElement("SampleItem",
                             new XElement("Id", "2"),
                             new XElement("StringValue", "sdddsdssd")
                           ); 

System.IO.MemoryStream dataSream1 = new MemoryStream();
data.Save(dataSream1);

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:2517/Service1/Create");
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
// You need to know length and it has to be set before you access request stream
request.ContentLength = dataSream1.Length;

using (Stream requestStream = request.GetRequestStream())
{
    dataSream1.CopyTo(requestStream);
    byte[] bytes = dataSream1.ToArray();
    requestStream.Write(bytes, 0, Convert.ToInt16(dataSream1.Length));
    requestStream.Close();
}

WebResponse response = request.GetResponse();

Я получаю исключение в последней строке:

Удаленный сервер возвратил ошибку: (405) Метод не разрешен. Не уверен, почему это происходит, я попытался изменить хост с VS Server на IIS, но без изменений в результате. Дайте мне знать, если вам нужно больше информации

Пожалуйста, добавьте любую конфигурацию конфигурации / код, который вы используете. Drew Marsh
Как выглядят ваши маршруты? M.Babcock
Вы устанавливаете contenttype на «application / x-www-form-urlencoded» , Но вы отправляете данные XML. Можете ли вы установить тип контента как «application / xml»? Chandermani
У меня нет привязки конфигурации Praneeth

Ваш Ответ

6   ответов
0

post на имя функции, и это решило мою проблему. может быть, это поможет и некоторым из вас.

2

используя VS 2010 .NET 4.0, IIS 7.5 WCF и REST с JSON ResponseWrapped, я наконец-то взломал его, прочитав статью "При дальнейшем расследовании ..." Вотhttps://sites.google.com/site/wcfpandu/useful-links

Файл Reference.cs, сгенерированный кодом клиента веб-службы, не приписываетGET методы с[WebGet()], поэтому попыткиPOST их вместо этого, следовательно,InvalidProtocol, 405 Method Not Allowed.  Проблема, однако, этот файл создается заново, когда вы обновляете ссылку на службу, и вам также нужна ссылка на dll дляSystem.ServiceModel.Web, для атрибута WebGet.

Поэтому я решил вручную отредактировать файл Reference.cs и сохранить его копию. В следующий раз, когда я обновлю его, я объединю своиWebGet()s обратно в.

На мой взгляд, это ошибка с svcutil.exe, не распознающая, что некоторые из сервисных методовGET и не толькоPOSTхотя WSDL и HELP, публикуемые веб-службой IIS WCF, понимают, какие методыPOST а такжеGET??? Я зарегистрировал эту проблему в Microsoft Connect.

0

основной код пытался сделатьWebDAV ПОЛОЖИЛ. (Это конкретное приложение можно было настроить, чтобы включить эту функцию, если требуется; эта функция, без моего ведома, была включена, но необходимая среда веб-сервера не была настроена.

Надеюсь, это может помочь кому-то еще.

7

нужно знать точный URL-адрес вашей службы REST. Поскольку вы указалиhttp://localhost:2517/Service1/Create Теперь просто попробуйте открыть тот же URL из IE, и вы должны получить метод, не разрешенный как вашCreate Метод определен для WebInvoke, а IE выполняет WebGet.

Теперь убедитесь, что у вас есть SampleItem в вашем клиентском приложении, определенном в том же пространстве имен на вашем сервере, или убедитесь, что у создаваемой строки XML есть соответствующее пространство имен для службы, чтобы определить, что строка XML образца объекта может быть десериализована обратно. к объекту на сервере.

У меня есть SampleItem, определенный на моем сервере, как показано ниже:

namespace SampleApp
{
    public class SampleItem
    {
        public int Id { get; set; }
        public string StringValue { get; set; }            
    }    
}

Строка xml, соответствующая моему SampleItem, выглядит следующим образом:

<SampleItem xmlns="http://schemas.datacontract.org/2004/07/SampleApp" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><Id>6</Id><StringValue>from client testing</StringValue></SampleItem>

Теперь я использую метод ниже, чтобы выполнить POST для службы REST:

private string UseHttpWebApproach<T>(string serviceUrl, string resourceUrl, string method, T requestBody)
        {
            string responseMessage = null;
            var request = WebRequest.Create(string.Concat(serviceUrl, resourceUrl)) as HttpWebRequest;
            if (request != null)
            {
                request.ContentType = "application/xml";
                request.Method = method;
            }

            //var objContent = HttpContentExtensions.CreateDataContract(requestBody);
            if(method == "POST" && requestBody != null)
            {
                byte[] requestBodyBytes = ToByteArrayUsingDataContractSer(requestBody);
                request.ContentLength = requestBodyBytes.Length;
                using (Stream postStream = request.GetRequestStream())
                    postStream.Write(requestBodyBytes, 0, requestBodyBytes.Length);                    
            }

            if (request != null)
            {
                var response = request.GetResponse() as HttpWebResponse;
                if(response.StatusCode == HttpStatusCode.OK)
                {
                    Stream responseStream = response.GetResponseStream();
                    if (responseStream != null)
                    {
                        var reader = new StreamReader(responseStream);

                        responseMessage = reader.ReadToEnd();                        
                    }
                }
                else
                {
                    responseMessage = response.StatusDescription;
                }
            }
            return responseMessage;
        }

private static byte[] ToByteArrayUsingDataContractSer<T>(T requestBody)
        {
            byte[] bytes = null;
            var serializer1 = new DataContractSerializer(typeof(T));            
            var ms1 = new MemoryStream();            
            serializer1.WriteObject(ms1, requestBody);
            ms1.Position = 0;
            var reader = new StreamReader(ms1);
            bytes = ms1.ToArray();
            return bytes;
        }

Теперь я вызываю вышеуказанный метод, как показано:

SampleItem objSample = new SampleItem();
objSample.Id = 7;
objSample.StringValue = "from client testing";
string serviceBaseUrl = "http://localhost:2517/Service1";
string resourceUrl = "/Create";
string method="POST";

UseHttpWebApproach<SampleItem>(serviceBaseUrl, resourceUrl, method, objSample);

У меня также есть объект SampleItem, определенный на стороне клиента. Если вы хотите построить строку xml на клиенте и передать, то вы можете использовать метод ниже:

private string UseHttpWebApproach(string serviceUrl, string resourceUrl, string method, string xmlRequestBody)
            {
                string responseMessage = null;
                var request = WebRequest.Create(string.Concat(serviceUrl, resourceUrl)) as HttpWebRequest;
                if (request != null)
                {
                    request.ContentType = "application/xml";
                    request.Method = method;
                }

                //var objContent = HttpContentExtensions.CreateDataContract(requestBody);
                if(method == "POST" && requestBody != null)
                {
                    byte[] requestBodyBytes = ASCIIEncoding.UTF8.GetBytes(xmlRequestBody.ToString());
                    request.ContentLength = requestBodyBytes.Length;
                    using (Stream postStream = request.GetRequestStream())
                        postStream.Write(requestBodyBytes, 0, requestBodyBytes.Length);                    
                }

                if (request != null)
                {
                    var response = request.GetResponse() as HttpWebResponse;
                    if(response.StatusCode == HttpStatusCode.OK)
                    {
                        Stream responseStream = response.GetResponseStream();
                        if (responseStream != null)
                        {
                            var reader = new StreamReader(responseStream);

                            responseMessage = reader.ReadToEnd();                        
                        }
                    }
                    else
                    {
                        responseMessage = response.StatusDescription;
                    }
                }
                return responseMessage;
            }

И вызов вышеупомянутого метода будет таким, как показано ниже:

string sample = "<SampleItem xmlns=\"http://schemas.datacontract.org/2004/07/XmlRestService\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"><Id>6</Id><StringValue>from client testing</StringValue></SampleItem>";   
string serviceBaseUrl = "http://localhost:2517/Service1";
string resourceUrl = "/Create";
string method="POST";             
UseHttpWebApproach<string>(serviceBaseUrl, resourceUrl, method, sample);

ПРИМЕЧАНИЕ: просто убедитесь, что ваш URL правильный

Я получаю Удаленный сервер возвратил ошибку: (405) Метод не разрешен. Praneeth
Как работает ваш сервис? У вас есть запись в global.asax. Также проверьте, включена ли у вас страница справки, и попробуйте найти URL-адрес метода, который вы пытаетесь опубликовать, и убедитесь, что URL-адрес правильный.
Я отдал тебе голос за чистоту этого ... Praneeth
Можете ли вы удалить пустой атрибут URITemplate и посмотреть, работает ли он. Также ваша страница справки будет давать URL-адрес для метода CREATE во время POST
Справка работает, я могу увидеть сервисы в браузере и получить работает в браузере. Сервис размещается через VS Server, и у меня есть маршруты, зарегистрированные в global.asax Praneeth
2

Запустите команду ниже, чтобы зарегистрировать wcf.

"%WINDIR%\Microsoft.Net\Framework\v3.0\Windows Communication Foundation\ServiceModelReg.exe" -r
0

которую я исправил, поскольку ваша служба защищена учетными данными для входа с именем пользователя и паролем, попробуйте настроить имя пользователя и пароль по запросу, он будет работать. Удачи!

Похожие вопросы