일단 아래의 처럼 네이버 메일 > 환경설정 SMTP 에서 사용함으로 바꿧다는 가정하에

아래의 간단한 코드에 메일이 안가는 경우가 있음 그것은 바로 

중국에서 하도 털어서 2단계 인증 해놨는데...

네이버 2단계 인증 이거 하면 안감!  이거 해지해야함

            MailMessage sendMail = new MailMessage();           // System.Net.Mail
            sendMail.From = new MailAddress("보내는사람@naver.com");        // 보내는 사람
            sendMail.To.Add(new MailAddress("받는사람@naver.com"));       // 받는 사람
            sendMail.Subject = message.Subject;                   // 메일 제목
            sendMail.SubjectEncoding = System.Text.Encoding.UTF8;
            sendMail.Body = message.Body;
            sendMail.BodyEncoding = System.Text.Encoding.UTF8;

            SmtpClient client = new SmtpClient("smtp.naver.com" , 587);
            client.UseDefaultCredentials = true;
            client.EnableSsl = true;
            //client.Timeout = 10000;
            client.DeliveryMethod = SmtpDeliveryMethod.Network;
            client.Credentials = new NetworkCredential("네이버아이디", "비밀번호");
            client.Send(sendMail);

System.Net.Mail.SmtpException

  메시지=The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.1 

 

 

CssRewriteUrlTransform() 절대경로 설정가능

bundles.Add(new StyleBundle("~/Content/logincss")
.Include("~/Content/login.css" , new CssRewriteUrlTransform() )  );

 

https://www.freemon.co.kr

 

저희 프리몬 공식블로그에서는 여러분들과 소통하며 저희 프리몬에 관한 이야기를 들려드리기 위한 창구로서 저희 프리몬의 다양한 정보, 이야기, IT관련 소식등을 블로그를 통하여 들려드릴 예정입니다.

저희프리몬 공식블로그는 프리몬을 이용하시는 분들과 프리몬블로그에 방문하신 모든분들에게 도움이 되는 이야기를 만들어 나가고 싶습니다. 특히, 프리몬을 이용하는 TIP과 궁금한점은 언제든 알려주시면 블로그를 통해서 알려드릴수 있도록 노력 하겠습니다.

SI 아웃소싱 전문 플랫폼 '프리몬' 입니다.

저희 프리몬은 SI 전문 아웃소싱 전문 플랫폼 입니다.

프리몬에서는 선택은 자유롭지만 매번 일거리를 찾아야하는 막막함과 고민들을 겪는 일들을 해결하고 싶었습니다.

일정에 맞는 프리랜서 분들을 찾는데 어려움을 겪는 분들에게도 도움이 되고 싶었습니다. 저희는 이러한 고민들을 해결하고자 프리몬 타임라인을 통한 SI 아웃소싱 전문플랫폼 프리몬을 시작하게 되었습니다.

저희프리몬이 제공하는 타임라인을 통하여 프리랜서 분들에게는 보다 편하게 프로젝트를 찾고 관리할 수 있도록, 기업 분들에게는 보다 편하게 프리랜서 분들을 찾을 수 있도록 도와 드리고 있습니다. 그외에도 이력서 관리, 전자계약서 등을 통해 프리몬을 이용하시는 분들이 편하게 저희 프리몬을 이용할수 있도록 다양한 서비스를 하고 있습니다. 현재 '프리몬'은 프리몬 공식웹사이트와 프리몬 앱을 통하여 이용 가능합니다.


'프리몬' 만의 특별한 서비스를 소개해 드리겠습니다.

프리몬에서 제공한 특별한 서비스를 이용하여 좀 더 편하게 프로젝트,프리랜서를 찾고 이용하시는 모든분들이 편리하게 프로젝트에 관한일정관리를 하실수 있습니다.

1. 타임라인 [프리랜서일정/프로젝트일정]

저희 프리몬이 제공하는 타임라인을 통해 다양한 일정을 보다 쉽고 간편하게 확인 가능합니다

-프리랜서분들은 공고가 올라온 프로젝트들의 시작과 종료일정을 한눈에 파악할수 있습니다.

-기업고객분들은 프리랜서분들의 일정을 일일이 연락하지 않고 한눈에 파악할수 있습니다.

2.전자계약서

법적효력이 있는 저희프리몬 전자계약서로 간편하고 안전하게 계약서 관리가 가능합니다.

3. 인맥정보 제공

프리랜서 인맥정보를 통해 레퍼런스 체크는 물론, 손발이 딱딱! 맞은 동료들을 확인 할 수 있습니다.

4. 간편한 이력서 관리

사이트 등록때마다 이력서 등록하고, 프로젝트 마치고 경력 추가하고

프리몬에서는 이력서 등록은 파일등록으로 한번! 프리몬을 통해서 계약한 프로젝트가 자동으로 등록됩니다.

이젠 번거롭던 이력서 관리가 간편해집니다.

5. 프리몬 코디

프리랜서 어떻게 시작해야할지 막막했던 분들, 프리랜서 도전에 어려움을 겪는 분들

이런 분들을 위해 저희 프리몬 코디가 프리랜서 적응을 잘 할수 있도록 도와 드립니다.

6. 쉽고 간편한 프로젝트 관리

프로젝트를 쉽게 등록하고 관리가 가능합니다. 언제든 일정을 확인하여 프리랜서에게 프로젝트제안을 할 수 있고 프로젝트에 지원한 인재, 제안한 인재를 확인 가능합니다.

프리랜서 , SI 프로젝트 , 아웃소싱 , 프리몬 , freemon

 

https://www.freemon.co.kr

 

 

https://www.freemon.co.kr/

처음으로 저희 프리몬에 대한 소개할 이야기는 SI 아웃소싱 전문 플랫폼 '프리몬'의 공식 애플리케이션 (APP)입니다.

저희 SI 아웃소싱 전문 플랫폼인 '프리몬'은 웹(WEB) 뿐만 아니라 모바일 어플(APP)에서도 이용 가능합니다. 저희 프리몬의 공식 애플리케이션을 이용하신다면 좀 더 간편한 로그인, 쉬운 일정 확인이 가능합니다. 공식 어플은 아래와 같은 방법으로 구글플레이스토어와 애플 스토어에서 프리몬 또는 FREEMON (freemon)을 검색하시면 바로 다운받아 보실 수 있습니다.

iOS 다운로드 - https://itunes.apple.com/app/id1472330588

안드로이드 다운로드 - https://play.google.com/store/apps/details?id=kr.insighton.freemonservice

해당 어플의 설치가 완료되면,

개인 회원분들은 카카오 연동을 통한 버튼 한 번으로 간편한 로그인을 통해 이용이 가능합니다.

기업회원분들은 웹페이지와 동일하게 아이디와 패스워드를 입력해주시면 바로 이용이 가능합니다

프리몬 앱에서는 앱 클릭 한번으로 웹과 동일한 SI 아웃소싱 전문 플랫폼 '프리몬'의 모든 서비스를 이용하실수 있습니다.

 

 

 

 

조금 더 저희 프리몬을 편리하게 이용 가능한 ,

한 손으로 간편한 일정관리가 가능한 프리몬 앱 소개였습니다.

-언제나 저희 프리몬 공식 블로그는 여러분의 다양한 이야기를 반기고 있습니다.

소통되는 공식블로그, 플랫폼으로서 노력하겠습니다 -

 

 

 

 

[출처] [프리몬] 1. 프리몬 APP을 소개합니다.|작성자 프리몬

 

SI 전문 아웃소싱 플랫폼 '프리몬' : 네이버 블로그

단절에서 이음으로, 기회를 만드는 일정관리 - SI 전문 아웃소싱 플랫폼

blog.naver.com

프리랜서 , SI 프로젝트 , 아웃소싱 , 프리몬 , freemon

https://www.freemon.co.kr/

시퀸스 생성하는 프로시저 만들기

엔티티 모델에서 프로시저 등록하기

가져오기

        public int GetProgramSeq()
        {
            int i = 0;
            using (PbotEntities ctx = new PbotEntities())
            {
             
                var results = ctx.SP_GET_SEQ_PROGRAM();
                long? nextSequenceValue = results.SingleOrDefault();
             
                if( int.TryParse( nextSequenceValue.Value.ToString() , out i ))
                {
                    i = int.Parse(nextSequenceValue.Value.ToString());
                }

                return i;
            }
        }

https://docs.microsoft.com/ko-kr/dotnet/csharp/tutorials/attributes

 

특성 - C#

C#에서 특성이 작동하는 방식을 알아봅니다.

docs.microsoft.com

사용안하는 메소드 표시 방법

[Obsolete]
public class MyClass
{

}

 

[Obsolete("ThisClass is obsolete. Use ThisClass2 instead.")]
public class ThisClass
{

}

 

아래와 같이 바꾸기

:RadWindow 사용

 

App.xaml.cs

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;

namespace WpfApp1
{
    /// <summary>
    /// App.xaml에 대한 상호 작용 논리
    /// </summary>
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            new MainWindow().Show();
            base.OnStartup(e);
        }
    }
}

App.xaml 

StartupUri="MainWindow.xaml" 항목제거

<Application x:Class="WpfApp1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfApp1"
             >
    <Application.Resources>
         
    </Application.Resources>
</Application>

MainWindow.xaml.cs

MainWindow : Window ->  MainWindow : RadWindow 로 변경

 

MainWindow.xaml

<Window Tag를  telerik:RadWindow 로 변경 하면 끝

<telerik:RadWindow
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        xmlns:navigation="clr-namespace:Telerik.Windows.Controls.Navigation;assembly=Telerik.Windows.Controls.Navigation"
        navigation:RadWindowInteropHelper.ShowInTaskbar="True"
        xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" xmlns:Controls="clr-namespace:Telerik.Windows.Controls;assembly=Telerik.Windows.Controls" x:Class="WpfApp1.MainWindow"
        mc:Ignorable="d"

         Height="450" Width="800">
    <Grid Margin="8,0,-8,0">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" MinHeight="154"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <telerik:RadRibbonView x:Name="radRibbonView" VerticalAlignment="Top" Height="151" Margin="-10,0,10,0">
            <telerik:RadRibbonTab Header="File">
                <telerik:RadRibbonGroup Header="Icon Test">
                    <telerik:RadRibbonButton Size="Large" LargeImage="pack://siteoforigin:,,,/Resources/open.png" Margin="0,0,0,-1" HorizontalAlignment="Stretch" MinHeight="2"/>
                </telerik:RadRibbonGroup>
            </telerik:RadRibbonTab>
            <telerik:RadRibbonTab/>
            <telerik:RadRibbonTab/>
        </telerik:RadRibbonView>
        <telerik:RadDocking HasDocumentHost="True" HorizontalAlignment="Stretch" Margin="-10,2,10,0" VerticalAlignment="Stretch" Grid.Row="1">
            <telerik:RadSplitContainer>
                <telerik:RadPaneGroup HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                    <telerik:RadPane Header="Pane 1"/>
                </telerik:RadPaneGroup>
            </telerik:RadSplitContainer>
        </telerik:RadDocking>

    </Grid>
</telerik:RadWindow>

 

아래와 같이 하면 이미지파일로 떨어진다.

mycallback 에서 파일정보를 얻을수 있다.

function makeBlob() {

    var blob = myDiagram.makeImageData({
        background: "white"
        , returnType: "blob"
        , scale: 1
        , callback: myCallback
    });

    //
   

}

파일 서버로 보내기

// When the blob is complete, make an anchor tag for it and use the tag to initiate a download
// Works in:
// * Chrome
// * IE11, Edge
// * Firefox
function myCallback(blob) {
//서버로 전송
    $.ajax({
        type: "POST",
        url: "/api/diagramUpload/100",
        data: blob,
        processData: false,
        contentType: false,
        success: function (data) {

            alert('저장성공');
        },
        error: function (message) {
            alert(message);
        }
    });

    return;

//여기서 부터는 파일을 웹브라우저에서 바로 다운받는다.
    var url = window.URL.createObjectURL(blob);
    var filename = "pbot.png";

    var a = document.createElement("a");
    a.style = "display: none";
    a.href = url;
    a.download = filename;

    // IE 11
    if (window.navigator.msSaveBlob !== undefined) {
        window.navigator.msSaveBlob(blob, filename);
        return;
    }

    document.body.appendChild(a);
    requestAnimationFrame(function () {
        a.click();
        window.URL.revokeObjectURL(url);
        document.body.removeChild(a);
    });
}

ASP.NET API 에서 파일을 다운로드 하는방법

       /// <summary>  프로젝트 파일을 저장 합니다.</summary>
        /// <returns></returns>
        [System.Web.Http.Route("api/diagramUpload/{projectId}")]
        [System.Web.Http.HttpPost]
        public Task diagramUploadAsync(int projectId)
        {
            string root = System.Web.HttpContext.Current.Server.MapPath("~/ProjectImages");
            HttpRequestMessage request = this.Request;
            var content =  request.Content;

            FileStream fileStream = null;
            string pathname =  string.Format(@"{0}\{1}.png", root, projectId);
            try
            {
                fileStream = new FileStream(pathname, FileMode.Create, FileAccess.Write, FileShare.None);
                return content.CopyToAsync(fileStream).ContinueWith(
                    (copyTask) =>
                    {
                        fileStream.Close();
                    });
            }
            catch
            {
                if (fileStream != null)
                {
                    fileStream.Close();
                }

                throw;
            }


        }

 

WebBrowser  Json 오류 , JQuery 오류 처리하기

 

기본 WebBrowser 대신에 ChromiumWebBrowser  사용해서 오류 없애기

 

CefSharp.Wpf 용 설치

설치하기 비주얼 스튜디오 닫기

프로젝트 구성관리자 지정하기 x86  또는 x64 하나만 지정해야됨

안하면 아래와 같이 뜸

아래와 같이 입력함

xmlns:cefSharp="clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf"
   <cefSharp:ChromiumWebBrowser Grid.Row="0"
        Address="http://www.daum.net" />

전체소스

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        xmlns:cefSharp="clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf"

        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <cefSharp:ChromiumWebBrowser Grid.Row="0"
        Address="http://www.daum.net" />
    </Grid>
</Window>

 

 

 

참고사이트

https://www.codeproject.com/Articles/881315/Display-HTML-in-WPF-and-CefSharp-Tutorial-Part

Jquery dialog , Confirm callBack 받기

 

<html>
<head>
<script src="./Script/jquery-3.3.1.js"></script>
<script src="./Script/jquery-ui.min.js"></script>

<link rel="stylesheet" type="text/css" href="./Content/diagram.css">
<link rel="stylesheet" type="text/css" href="./Content/jquery-ui.min.css"> 
<link rel="stylesheet" type="text/css" href="./Content/jquery-ui.theme.min.css"> 
<script>
var bot ={};
var messageDialog;
$(document).ready(function(){

    bot.windows ={
        alert : function(msg){
            alert(msg);
        },
        confirm : function(msgCallBack){
            //confirm("test");

            $("#msgInfo").dialog({
                            autoOpen: false,
                            height: 200,
                            width: 350,
                            modal: true,

                            buttons: {
                                Ok: function () {
                                    msgCallBack('OK');
                                    $(this).dialog("close");
                                },
                                Cancel: function () {
                                    msgCallBack('CANCEL');
                                    $(this).dialog("close");
                                }
                            }
                        });

                        $("#msgInfo").dialog("open");
        }
   }

   //요렇게 써도됨
   messageDialog  = function(msgCallBack){  
                        $("#msgInfo").dialog({
                            autoOpen: false,
                            height: 200,
                            width: 350,
                            modal: true,

                            buttons: {
                                Ok: function () {
                                    msgCallBack('OK');
                                    $(this).dialog("close");
                                },
                                Cancel: function () {
                                    msgCallBack('CANCEL');
                                    $(this).dialog("close");
                                }
                            }
                        });

                        $("#msgInfo").dialog("open");

                    }


    test();
});

function test(){

   // 정상실행
   // var result =   bot.windows.confirm("alert test");
   // console.log(result);

    //정상실행
    // messageDialog(  
    //     function msgCallBack( msg){
    //        console.log(msg);
    //     });

    var result =   bot.windows.confirm( 
        function msgCallBack( msg){
            console.log(msg); //여기서 결과값 반환
         });

   }

</script>
</head>

<body>

<input type="button" value="test" onclick="test()">

<div id="msgInfo" title="Confirm">
        <div id="messageText" class="elementText"></div>
</div>
</body>
</html>

 

+ Recent posts